• 使用Newtonsoft.Json进行Json与XML相互转换


    XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析好像没啥难度。今天突然发现Newtonsoft.Json中有关于Json和XML互转的方法,所以顺带记录总结一下。

    一、关于Newtonsoft.Json

    Newtonsoft.Json(Json.Net)是一款.NET中开源的Json序列化和反序列化类库。

    Json.Net是一个读写Json效率比较高的.Net框架,.Json.Net 使得在.Net环境下使用Json更加简单。通过Linq To JSON可以快速的读写Json,通过JsonSerializer可以序列化你的.Net对象。让你轻松实现.Net中所有类型(对象,基本数据类型等)和Json的转换。

    Json.Net效率

    二、Json与类对象之间相互转换

    对象序列化Json字符串:

    JsonConvert.SerializeObject(object value)
    

    Json字符串反序列化为对象:

    JsonConvert.DeserializeObject(string value)
    JsonConvert.DeserializeObject<T>(string value)
    

    使用例子:

    TaskData数据类:

        public class TaskData
        {
            public int ID;//任务ID
            public string Name;//任务名称
            public string Des;//任务描述
            public int MaxNum;//最大人数
        }
    

    序列化和反序列化调用:

    	void Start () {
    		TaskData data = new TaskData();
    		data.ID = 0;
    		data.Name = "排战术 进攻战斗";
    		data.Des = "开进展开、协同攻击、夺取阵地。";
    		data.MaxNum = 4;
    
            string json = JsonConvert.SerializeObject(data);
            Debug.Log(json);//Unity中打印日志输出
            TaskData data= JsonConvert.DeserializeObject<TaskData>(json);
    	}
    

    非常简单,但需要注意一点,如果你的对象类中涉及继承、特定属性存在NULL值之类比较复杂的操作,需要使用序列化和反序列化带有JsonSerializerSettings参数的重载。
    重载
    这些操作可以参考官方文档,总之如果你的Json反序列化失败,Json序列化异常,很可能是需要设置JsonSerializerSettings。
    官方文档说明:https://www.newtonsoft.com/json/help/html/SerializationSettings.htm
    也可以参考另一篇博客,但不如官方文档那么全:
    https://www.cnblogs.com/zhaoshujie/p/11077843.html

    三、Json与XML相互转换

    XML序列化为Json字符串:

    JsonConvert.SerializeXmlNode(XmlNode node)
    

    Json反序列化为XML对象:

    JsonConvert.DeserializeXmlNode(string value)
    

    我在这里用一个稍微复杂的例子,涉及数据类包含List:

    使用例子:

    TaskData数据类:

        public class TaskData
        {
            public int ID;//任务ID
            public string Name;//任务名称
            public string Des;//任务描述
            public int MaxNum;//最大人数
        }
    

    任务配置类:

    	public class TaskConfigData
    	{
        	public List<TaskData> TaskDataList = new List<TaskData>();
    	}
    

    Json反序列化为XML,并保存本地:

    void Save() {
    	string XMLpath = Application.streamingAssetsPath + "/TaskConfig.xml";//XMLpath 为XML文档保存路径
    	//准备序列化数据
    	TaskConfigData	_taskConfigData = new TaskConfigData();
    	TaskData data = new TaskData();
    	data.ID = 0;
    	data.Name = "排战术 进攻战斗";
    	data.Des = "开进展开、协同攻击、夺取阵地。";
    	data.MaxNum = 4;
    	_taskConfigData.TaskDataList.Add(data);
    	
    	//数据序列化为Json字符串
    	string json = JsonConvert.SerializeObject(_taskConfigData);
    	
    	//Json反序列化为Xml
    	XmlDocument xml = JsonConvert.DeserializeXmlNode(json, "", true);
        xml.Save(XMLpath);//保存,
    
    }
    

    读取XML序列化为Json

    void Read() {
    	//读取本地Xml
    	string xmlStr = System.IO.File.ReadAllText(Application.streamingAssetsPath + "/TaskConfig.xml");
    	XmlDocument doc = new XmlDocument();
    	doc.LoadXml(xmlStr);
    	
    	//XML序列化为Json
    	string json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(doc,Formatting.None,false);
    
    	//Json序列化为数据
    	TaskConfigData _taskConfigData = JsonConvert.DeserializeObject<TaskConfigData>(json);
    	Debug.Log(_taskConfigData.TaskDataList.Count);//Unity打印日志输出
    }
                            
    

    如果你在XML和Json相互转换数组或集合出现问题,像这种错误:

    Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'EasyNote.Translate.Bing.Rootobject' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly. To fix this error either change the JSON to a JSON object

    就需要注意一下,我用的是DeserializeXmlNode()和SerializeXmlNode()方法的重载。为什么用重载呢?因为我的数据类中包含List泛型数据,若直接转换会报错。

    DeserializeXmlNode重载
    DeserializeXmlNode重载中,参数deserializeRootElementName指的是创建XML文档的根节点名,传入""不创建根节点,writeArrayAttribute是否用到数组属性,我这里用到了List所以必须设置为true。

    生成的XML:
    生成的XML
    可以看到XML添加了数组属性。
    SerializeXmlNode重载
    SerializeXmlNode重载中,参数formatting指的是Json字符串格式有没有缩进,我也用的默认值None。omitRootObject获取或设置一个值,该值指示是否写入根JSON对象,我之前设置""没有写入,所以设置false。

    在整个XML和Json转换中,主要注意一下writeArrayAttribute、omitRootObject和deserializeRootElementName根据自己定义的数据类进行设置,要不然容易出问题。

    四、总结

    Newtonsoft.Json确实相当强大,目前还只是用了小小的一部分功能,以后会再看看源码,学习更高级使用方法。
    附带源码地址:
    https://github.com/JamesNK/Newtonsoft.Json
    官网地址:
    https://www.newtonsoft.com/json
    官方文档地址:
    https://www.newtonsoft.com/json/help/html/Introduction.htm

  • 相关阅读:
    mingW与cygwin
    Ruby on Rails 和 J2EE:两者能否共存?
    嵌入式Linux学习笔记(一) 启航、计划和内核模块初步体验
    嵌入式Linux学习笔记(六) 上位机QT界面实现和通讯实现
    嵌入式Linux问题总结(一) Ubuntu常用命令和编译问题解决方法
    嵌入式Linux学习笔记(五) 通讯协议制定和下位机代码实现
    嵌入式Linux学习笔记(四) 设备树和UART驱动开发
    嵌入式Linux学习笔记(三) 字符型设备驱动--LED的驱动开发
    嵌入式Linux学习笔记(二) 交叉编译环境和Linux系统编译、下载
    记录嵌入式面试的流程
  • 原文地址:https://www.cnblogs.com/craft0625/p/13825513.html
Copyright © 2020-2023  润新知