Newtonsoft.Json
作者:追风剑情 发布于:2021-9-7 9:43 分类:C#
官方网站
GitHub下载
[官方文档] Newtonsoft.Json
Json.NET (即,Newtonsoft.Json) 是一种流行的 .NET 高性能 JSON 框架。
System.Windows.Data.IValueConverter 是 WPF 的数据转换器接口,在源数据与目标数据之间做类型转换。
Newtonsoft.Json.JsonConverter 是 Newtonsoft 定义的数据转换抽象类,在序列化和反序列化时做类型或格式转换。
Newtonsoft.Json.Serialization.DefaultContractResolver 是 Newtonsoft 的默认序列化与反序列化解析器,可以创建一个派生它的类,重写DefaultContractResolver() 方法来定义要序列化的属性清单。
string json = JsonConvert.SerializeObject(obj); //序列化
object obj = JsonConvert.DeserializeObject<T>(json); //反序列化
[JsonProperty("y")] //定义序列化别称
public int Y { get; set; }
[JsonConverter(typeof(JsonVector3Converter))] //定义转换器
[JsonConverter(typeof(StringEnumConverter))] //将枚举序列化为字符串
[JsonIgnore] //忽略
一、自定义转换器和解析器
示例:序列化 UnityEngine.Vector3
WPF Vector3 转换器
using System; using System.Windows.Data; using System.Globalization; using Newtonsoft.Json; using UnityEngine; using DataEditor.Utils; namespace DataEditor.Converter { /// <summary> /// WPF Vector3 转换器 /// </summary> public class Vector3Converter : IValueConverter { //缓成上一次正确的对象 private object cacheValue; //此方法返回的值将绑定到UI上 public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { Vector3 v = (Vector3)value; string json = JsonHelper.SerializeVector3(v); return json; } //UI编辑后回传时调用此方法 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { object modifiedValue; try { var settings = new JsonSerializerSettings(); //Json中出现了C#对象中没有的成员时,抛出错误。 settings.MissingMemberHandling = MissingMemberHandling.Error; Vector3 v = var v = JsonConvert.DeserializeObject(value as string, settings); modifiedValue = v; cacheValue = modifiedValue; } catch { //如果反序列化失败,则用上一次正确的值代替 modifiedValue = cacheValue; } return modifiedValue; } } }
Json Vector3 解析器
using System; using System.Collections.Generic; using System.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; namespace DataEditor.Resolver { /// <summary> /// 参考 https://www.cnblogs.com/yanweidie/p/4605212.html /// </summary> public class Vector3ContractResolver : DefaultContractResolver { //要序列化的属性清单 string[] props = null; bool retain; /// <summary> /// 构造函数 /// </summary> /// <param name="props">传入属性数组</param> /// <param name="retain">true:表示props是需要保留的属性. false:表示props是需要排除的属性</param> public Vector3ContractResolver(string[] props, bool retain = true) { this.props = props; this.retain = retain; } protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { IList<JsonProperty> list = base.CreateProperties(type, memberSerialization); //只保留清单有列出的属性 return list.Where(p => { if (retain) { return props.Contains(p.PropertyName); } else { return !props.Contains(p.PropertyName); } }).ToList(); } } }
Json辅助类
using UnityEngine; using Newtonsoft.Json; using DataEditor.Resolver; namespace DataEditor.Utils { public sealed class JsonHelper { public static string SerializeVector3(Vector3 v) { //只序列化Vector3的x,y,z属性 JsonSerializerSettings setting = new JsonSerializerSettings(); setting.ContractResolver = new Vector3ContractResolver(new string[] { "x", "y", "z" }, true); string json = JsonConvert.SerializeObject(v, setting); return json; } } }
在Android平台下如果报以下错:
E/Unity: PlatformNotSupportedException: Operation is not supported on this platform.
解决方法: 在Unity的 Project Settings->Player->Other Settings->Api Compatibility Level设置成.NET 4.x
在UWP平台下如果报以下错:
System.Reflection.Emit.DynamicMethod::.ctor
原因:Unity导出IL2CPP过程中剥离掉了Newtonsoft.Json使用到的程序集。
解决方法:
参考: https://blog.csdn.net/abc1329/article/details/126872480
1、将netstandard2.0目录下的Newtonsoft.Json.dll文件拷到Unity工程的Assets/Plugins目录下。
2、在Assets目录下新建link.xml
<linker>
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions.Interpreter.LightLambda" preserve="all" />
</assembly>
</linker>
参考文献[Unity手册] ManagedCodeStripping
[微软文档] Add packages from NuGet to a Unity project
using System; using UnityEngine; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Utilities; using System.Collections.Generic; using System.Reflection; using System.Linq; /// <summary> /// Json 辅助类 /// </summary> public sealed class JsonHelper { public static string ToJson(object obj) { string json = ""; try { var settings = new JsonSerializerSettings { ContractResolver = new FieldContractResolver() }; //兼容Unity序列化 var receiver = obj as ISerializationCallbackReceiver; if (receiver != null) receiver.OnBeforeSerialize(); json = JsonConvert.SerializeObject(obj, settings); } catch (Exception ex) { Debug.LogErrorFormat("{0}\n{1}", ex.Message, ex.StackTrace); } return json; } public static object FromJson(string json, Type type) { object obj = null; try { obj = JsonConvert.DeserializeObject(json, type); //兼容Unity序列化 var receiver = obj as ISerializationCallbackReceiver; if (receiver != null) receiver.OnAfterDeserialize(); } catch (Exception ex) { Debug.LogErrorFormat("{0}\n{1}", ex.Message, ex.StackTrace); } return obj; } public static T FromJson<T>(string json) { T obj = default(T); try { obj = JsonConvert.DeserializeObject<T>(json); //兼容Unity序列化 var receiver = obj as ISerializationCallbackReceiver; if (receiver != null) receiver.OnAfterDeserialize(); } catch (Exception ex) { Debug.LogErrorFormat("{0}\n{1}", ex.Message, ex.StackTrace); } return obj; } } /// <summary> /// 仅序列化字段(Field) /// </summary> public class FieldContractResolver : DefaultContractResolver { protected override List<MemberInfo> GetSerializableMembers(Type objectType) { BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public; IEnumerable<FieldInfo> enumerable = objectType.GetFields(bindingFlags).Cast<FieldInfo>(); List<MemberInfo> list = new List<MemberInfo>(); foreach (var item in enumerable) { //如果字段上添加了忽略特性,直接跳过 var jsonIgnore = item.GetCustomAttributes<JsonIgnoreAttribute>().FirstOrDefault(); if (jsonIgnore != null) continue; //如果是public字段 if (item.IsPublic) { list.Add(item); continue; } //如果字段上添加了JsonProperty特性 var jsonProperty = item.GetCustomAttributes<JsonPropertyAttribute>().FirstOrDefault(); if (jsonProperty != null) { list.Add(item); } } return list; } }
标签: C#
日历
最新文章
随机文章
热门文章
分类
存档
- 2024年11月(3)
- 2024年10月(5)
- 2024年9月(3)
- 2024年8月(3)
- 2024年7月(11)
- 2024年6月(3)
- 2024年5月(9)
- 2024年4月(10)
- 2024年3月(11)
- 2024年2月(24)
- 2024年1月(12)
- 2023年12月(3)
- 2023年11月(9)
- 2023年10月(7)
- 2023年9月(2)
- 2023年8月(7)
- 2023年7月(9)
- 2023年6月(6)
- 2023年5月(7)
- 2023年4月(11)
- 2023年3月(6)
- 2023年2月(11)
- 2023年1月(8)
- 2022年12月(2)
- 2022年11月(4)
- 2022年10月(10)
- 2022年9月(2)
- 2022年8月(13)
- 2022年7月(7)
- 2022年6月(11)
- 2022年5月(18)
- 2022年4月(29)
- 2022年3月(5)
- 2022年2月(6)
- 2022年1月(8)
- 2021年12月(5)
- 2021年11月(3)
- 2021年10月(4)
- 2021年9月(9)
- 2021年8月(14)
- 2021年7月(8)
- 2021年6月(5)
- 2021年5月(2)
- 2021年4月(3)
- 2021年3月(7)
- 2021年2月(2)
- 2021年1月(8)
- 2020年12月(7)
- 2020年11月(2)
- 2020年10月(6)
- 2020年9月(9)
- 2020年8月(10)
- 2020年7月(9)
- 2020年6月(18)
- 2020年5月(4)
- 2020年4月(25)
- 2020年3月(38)
- 2020年1月(21)
- 2019年12月(13)
- 2019年11月(29)
- 2019年10月(44)
- 2019年9月(17)
- 2019年8月(18)
- 2019年7月(25)
- 2019年6月(25)
- 2019年5月(17)
- 2019年4月(10)
- 2019年3月(36)
- 2019年2月(35)
- 2019年1月(28)
- 2018年12月(30)
- 2018年11月(22)
- 2018年10月(4)
- 2018年9月(7)
- 2018年8月(13)
- 2018年7月(13)
- 2018年6月(6)
- 2018年5月(5)
- 2018年4月(13)
- 2018年3月(5)
- 2018年2月(3)
- 2018年1月(8)
- 2017年12月(35)
- 2017年11月(17)
- 2017年10月(16)
- 2017年9月(17)
- 2017年8月(20)
- 2017年7月(34)
- 2017年6月(17)
- 2017年5月(15)
- 2017年4月(32)
- 2017年3月(8)
- 2017年2月(2)
- 2017年1月(5)
- 2016年12月(14)
- 2016年11月(26)
- 2016年10月(12)
- 2016年9月(25)
- 2016年8月(32)
- 2016年7月(14)
- 2016年6月(21)
- 2016年5月(17)
- 2016年4月(13)
- 2016年3月(8)
- 2016年2月(8)
- 2016年1月(18)
- 2015年12月(13)
- 2015年11月(15)
- 2015年10月(12)
- 2015年9月(18)
- 2015年8月(21)
- 2015年7月(35)
- 2015年6月(13)
- 2015年5月(9)
- 2015年4月(4)
- 2015年3月(5)
- 2015年2月(4)
- 2015年1月(13)
- 2014年12月(7)
- 2014年11月(5)
- 2014年10月(4)
- 2014年9月(8)
- 2014年8月(16)
- 2014年7月(26)
- 2014年6月(22)
- 2014年5月(28)
- 2014年4月(15)
友情链接
- Unity官网
- Unity圣典
- Unity在线手册
- Unity中文手册(圣典)
- Unity官方中文论坛
- Unity游戏蛮牛用户文档
- Unity下载存档
- Unity引擎源码下载
- Unity服务
- Unity Ads
- wiki.unity3d
- Visual Studio Code官网
- SenseAR开发文档
- MSDN
- C# 参考
- C# 编程指南
- .NET Framework类库
- .NET 文档
- .NET 开发
- WPF官方文档
- uLua
- xLua
- SharpZipLib
- Protobuf-net
- Protobuf.js
- OpenSSL
- OPEN CASCADE
- JSON
- MessagePack
- C在线工具
- 游戏蛮牛
- GreenVPN
- 聚合数据
- 热云
- 融云
- 腾讯云
- 腾讯开放平台
- 腾讯游戏服务
- 腾讯游戏开发者平台
- 腾讯课堂
- 微信开放平台
- 腾讯实时音视频
- 腾讯即时通信IM
- 微信公众平台技术文档
- 白鹭引擎官网
- 白鹭引擎开放平台
- 白鹭引擎开发文档
- FairyGUI编辑器
- PureMVC-TypeScript
- 讯飞开放平台
- 亲加通讯云
- Cygwin
- Mono开发者联盟
- Scut游戏服务器引擎
- KBEngine游戏服务器引擎
- Photon游戏服务器引擎
- 码云
- SharpSvn
- 腾讯bugly
- 4399原创平台
- 开源中国
- Firebase
- Firebase-Admob-Unity
- google-services-unity
- Firebase SDK for Unity
- Google-Firebase-SDK
- AppsFlyer SDK
- android-repository
- CQASO
- Facebook开发者平台
- gradle下载
- GradleBuildTool下载
- Android Developers
- Google中国开发者
- AndroidDevTools
- Android社区
- Android开发工具
- Google Play Games Services
- Google商店
- Google APIs for Android
- 金钱豹VPN
- TouchSense SDK
- MakeHuman
- Online RSA Key Converter
- Windows UWP应用
- Visual Studio For Unity
- Open CASCADE Technology
- 慕课网
- 阿里云服务器ECS
- 在线免费文字转语音系统
- AI Studio
- 网云穿
- 百度网盘开放平台
- 迅捷画图
- 菜鸟工具
- [CSDN] 程序员研修院
- 华为人脸识别
- 百度AR导航导览SDK
- 海康威视官网
- 海康开放平台
- 海康SDK下载
- git download
交流QQ群
-
Flash游戏设计: 86184192
Unity游戏设计: 171855449
游戏设计订阅号