首页 > 其他分享 >使用Newtonsoft.Json进行Json与XML相互转换

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

时间:2023-12-21 15:47:19浏览次数:37  
标签:XML Newtonsoft string Json 序列化 data public

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

标签:XML,Newtonsoft,string,Json,序列化,data,public
From: https://www.cnblogs.com/webenh/p/17919183.html

相关文章

  • C# xml与对象相互转换
    例如:1.对象转xml(对象序列化为xml) stringstrImage=XmlSerializeHelper.Serialize<List<ImageSingle>>(imageList);2.xml转对象(反序列化) Imagebojimag=XmlSerializeHelper.DeSerialize<Image>(strimage);该序列化处理类如下: usingSystem;usingSys......
  • Json.Net Deserialize a Collection from BSON
    DeserializeaCollectionfromBSON(newtonsoft.com)Thissamplesets ReadRootValueAsArray to true sotherootBSONvalueiscorrectlyreadasanarrayinsteadofanobjectanddeserializesBSONtoacollection.SampleTypesCopypublicclassEv......
  • cjson 用法
     1、修改字典的值cJSON_SetValuestring(objectItem,value)//先获取objectTempPtr=cJSON_GetObjectItem(TempPtr,"nm");//修改该object的值cJSON_SetValuestring(TempPtr,"guxiangdehai");2、删除数组里面的值cJSON_DeleteItemFromArray(Array,index);//Array要......
  • fastjson2
    什么是JSONJSON是一种轻量级的数据交换格式。它基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构是的JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。JSON语法使用大括号......
  • Fastjson2基础使用以及底层序列化/反序列化实现探究
    来自于:https://www.cnblogs.com/6b7b5fc3/p/17134421.html1Fastjson2简介Fastjson2是Fastjson的升级版,特征:协议支持:支持JSON/JSONB两种协议部分解析:可以使用JSONPath进行部分解析获取需要的值语言支持:Java/Kotlin场景支持:Android8+/服务端其他特性支持:GraalNative-Image......
  • json.NewDecode用法
    Go使用RFC3339进行编码,如果控制生成的json,只需将2022-04-03T00:00:00.000更改为2022-04-03T00:00:00.000Z。例如,这是有效的。typeContractstruct{ContractId*int`json:"contract_id"`CompanyId*int`json:"company_id"`Dat......
  • XML操作
    XML操作因XML的易于读取和修改,因此可以存放程序的可配置项C#中的XML操作通过ConfigurationManager类读取通过该方法只能实现Get操作。并且在Winform框架下,无法实现配置文件的热加载privatestaticstringapiUrl=ConfigurationManager.AppSettings["Url"];通过XmlDo......
  • 【SpringBootWeb入门-16】Mybatis-基础操作-多条件查询操作&XML文件配置SQL
    1、章节回顾上一篇文章我们讲解了Mybatis的增改查操作,本篇继续学习Mybatis的复杂查询操作(多条件查询)。2、增删改查操作-多条件查询操作根据条件姓名、性别、入职时间来查询员工表emp数据,其中员工姓名支持模糊匹配,性别进行精确匹配,入职时间进行范围查询,查询结果按照最后修改时间......
  • OS模块和JSON模块
    OS模块和JSON模块【一】OS模块【二】JSON模块【1】序列化与反序列化序列化和反序列化是计算机科学中数据处理中的两个过程,用于将数据从一种格式转换为另一种格式。这两个过程通常称为编码和解码。序列化是将数据结构或对象转换为字节序列的过程,使得数据可以以一种易于传输......
  • c# - 如何在自定义 System.Text.Json JsonConverter 中使用默认序列化?
    我正在写一个 custom System.Text.Json.JsonConverter 将旧数据模型升级到新版本。我已覆盖 Read()并实现了必要的后处理。但是,我根本不需要在 Write() 中做任何自定义操作。方法。如果我根本没有转换器,如何自动生成默认序列化?显然我可以使用不同的 JsonSerializerOption......