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与类对象之间相互转换

对象序列化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重载中,参数deserializeRootElementName指的是创建XML文档的根节点名,传入""不创建根节点,writeArrayAttribute是否用到数组属性,我这里用到了List所以必须设置为true。

 生成的XML:

可以看到XML添加了数组属性。

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

使用Newtonsoft.Json进行Json与XML相互转换的更多相关文章

  1. xml的序列化与反序列化求一个好用的东西,类似,newtonsoft.net转json的东西。xml里面的结构和数据库不一致..................

    xml的序列化与反序列化求一个好用的东西,类似,newtonsoft.net转json的东西.xml里面的结构和数据库不一致..................

  2. JSON对象与XML相互转换工具类

    依赖jar <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId ...

  3. .Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程

    JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询 ...

  4. json、javaBean、xml互转的几种工具介绍

    json.javaBean.xml互转的几种工具介绍 转载至:http://blog.csdn.net/sdyy321/article/details/7024236 工作中经常要用到Json.Jav ...

  5. json、javaBean、xml互转的几种工具介绍 (转载)

    工作中经常要用到Json.JavaBean.Xml之间的相互转换,用到了很多种方式,这里做下总结,以供参考. 现在主流的转换工具有json-lib.jackson.fastjson等,我为大家一一做简 ...

  6. SQL中采用Newtonsoft.Json处理json字符串

    原文 SQL中采用Newtonsoft.Json处理json字符串 使用环境: SQL Server2005; VS2010; 关于SQL中部署CLR程序集的方法,网上一搜一大把,需要了解的自行查阅, ...

  7. JSON,Bean,XML,List,Map

    http://blog.csdn.net/superit401/article/details/51728929 JSON-lib这个Java类包用于把bean,map和XML转换成JSON并能够把J ...

  8. Newtonsoft.Json(Json.net)的基本用法

    Newtonsoft.Json(Json.net)的基本用法 其它资料 JSON详解 添加引用: 使用NuGet,命令:install-package Newtonsoft.Json 实体类: pub ...

  9. C#应用Newtonsoft.Json操作json[2]-反序列化不定类型

    在读json时,有时不知道对方的数据类型是什么样的,本文用Newtonsoft,把json反序列化为List>,在某种情况下还是有用的. private static List<Dicti ...

  10. Python自动化运维之10、模块之json、pickle、XML、PyYAML、configparser、shutil

    序列化 Python中用于序列化的两个模块 json     用于[字符串]和 [python基本数据类型] 间进行转换 pickle   用于[python特有的类型] 和 [python基本数据类 ...

随机推荐

  1. HDC2021技术分论坛:分布式调试、调优能力解决方案

    作者:yangjianwei 华为高级工程师 HarmonyOS致力于提供1+8+N智慧全场景解决方案,打造设备流转.多端协同的分布式体验,实现一次开发.多端部署,让分布式应用的开发更加简单. 针对分 ...

  2. jenkins 持续集成和交付——pipeline(五)

    前言 整理一下pipeline. 正文 介绍 什么是pipeline呢? 根据前面的所得,我们知道,以前都是模板形式,但是如果有些复杂的项目,需要用更加自定义的写法,那么就有了pipeline,也就是 ...

  3. Har 版本包发布

    新建 Module 注意名字最好是小写命名 oh-package.json5 修改 description 描述信息 在 Index.ets 导出对外暴露的组件 export{ TitleBar } ...

  4. HarmonyOS NEXT应用开发之异常处理案例

    介绍 本示例介绍了通过应用事件打点hiAppEvent获取上一次应用异常信息的方法,主要分为应用崩溃.应用卡死以及系统查杀三种. 效果图预览 使用说明: 点击构建应用崩溃事件,3s之后应用退出,然后打 ...

  5. Maxcompute-UNION数据类型对齐的方法

    简介: 怎么对齐两段union脚本的数据类型 第1章      问题概述 1.1     UNION中隐式类型转换问题 近期参与的一个私有云项目要升级,因为maxcompute要升级到更新的版本,对之 ...

  6. Flink 源码 | 自定义 Format 消费 Maxwell CDC 数据

    Flink 1.11 最重要的 Feature -- Hive Streaming 之前已经和大家分享过了,今天就和大家来聊一聊另一个特别重要的功能 -- CDC. CDC概述 何为CDC?Chang ...

  7. 基于链路思想的SpringBoot单元测试快速写法

    ​简介:本文更偏向实践而非方法论,所提及的SpringBoot单元测试写法亦并非官方解,仅仅是笔者自身觉得比较方便.效率较高的一种写法.每个团队甚至团队内的每位开发可能都有自己的写法习惯和风格,只要能 ...

  8. 不改一行代码,轻松拥有企业级微服务治理|MSE微服务治理专业版重磅发布

    ​简介:随着业务的发展,微服务拆分越来越复杂,微服务的治理也成了一个比较令人头疼的问题.有没有更加简单且高效的方法来解决微服务治理的难题? 作者:十眠 随着业务的发展,微服务拆分越来越复杂,微服务的治 ...

  9. 干货|一文读懂阿里云数据库Autoscaling是如何工作的

    简介: 阿里云数据库实现了其特有的Autosaling能力,该能力由数据库内核.管控及DAS(数据库自治服务)团队共同构建,内核及管控团队提供了数据库Autoscaling的基础能力,DAS则负责性能 ...

  10. 前沿分享|阿里云资深技术专家 魏闯先:AnalyticDB PostgreSQL年度新版本发布

    ​简介: 本篇内容为2021云栖大会-云原生数据仓库AnalyticDB技术与实践峰会分论坛中,阿里云资深技术专家 魏闯先关于"AnalyticDB PostgreSQL年度新版本发布&qu ...