详解C#对XML、JSON等格式的解析

 更新时间:2016年12月06日 10:46:32   作者:极简  
这篇文章主要介绍了详解C#对XML、JSON等格式的解析,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

一、C#对XML格式数据的解析

1、用XMLDocument来解析

XmlDocument xmlDocument = new XmlDocument(); 
xmlDocumentLoad("testxml"); 
 
//创建新节点  
XmlElement nn = xmlDocumentCreateElement("image"); 
nnSetAttribute("imageUrl", "jpg"); 
 
XmlNode node = xmlDocumentSelectSingleNode("content/section/page/gall/folder");//定位到folder节点 
nodeAppendChild(nn);//附加新节点 
 
//保存 
xmlDocumentSave("testxml"); 

2、用Linq to XML来解析

可以通过遍历,来获得你想要的节点的内容或属性

XElement root = XElementLoad("testxml"); 
foreach (XAttribute att in rootAttributes()) 
{ 
  rootAdd(new XElement(attName, (string)att)); 
} 
ConsoleWriteLine(root); 

3、附一个详细点的例子

比如要解析如下的xml文件,将其转化为Ilist对象。

<?xml version="0" encoding="utf-8"?> 
<Car> 
 <carcost> 
  <ID>20130821133126</ID> 
  <uptime>60</uptime> 
  <downtime>30</downtime> 
  <price>4</price> 
 </carcost> 
 <carcost> 
  <ID>20130821014316</ID> 
  <uptime>120</uptime> 
  <downtime>60</downtime> 
  <price>3</price> 
 </carcost> 
 <carcost> 
  <ID>20130822043127</ID> 
  <uptime>30</uptime> 
  <downtime>0</downtime> 
  <price>5</price> 
 </carcost> 
 <carcost> 
  <ID>20130822043341</ID> 
  <uptime>120以上!</uptime> 
  <downtime>120</downtime> 
  <price>2</price> 
 </carcost> 
</Car> 

在控制台应用程序中输入如下代码即可。

class Program 
{ 
  static void Main(string[] args) 
  { 
    IList<CarCost> resultList = new List<CarCost>(); 
 
    XmlDocument xmlDocument = new XmlDocument(); 
    xmlDocumentLoad("testxml"); 
 
    XmlNodeList xmlNodeList = xmlDocumentSelectSingleNode("Car")ChildNodes; 
    foreach (XmlNode list in xmlNodeList) 
    { 
      CarCost carcost = new CarCost 
      ( 
        listSelectSingleNode("ID")InnerText, 
        listSelectSingleNode("uptime")InnerText, 
        listSelectSingleNode("downtime")InnerText, 
        floatParse(listSelectSingleNode("price")InnerText) 
      ); 
      resultListAdd(carcost); 
    } 
 
    IEnumerator enumerator = resultListGetEnumerator(); 
    while (enumeratorMoveNext()) 
    { 
      CarCost carCost = enumeratorCurrent as CarCost; 
      ConsoleWriteLine(carCostID + " " + carCostUpTime + " " + carCostDownTime + " " + carCostPrice); 
    } 
  } 
} 
 
public class CarCost 
{ 
  public CarCost(string id, string uptime, string downtime, float price) 
  { 
    thisID = id; 
    thisUpTime = uptime; 
    thisDownTime = downtime; 
    thisPrice = price; 
  } 
  public string ID { get; set; } 
  public string UpTime { get; set; } 
  public string DownTime { get; set; } 
  public float Price { get; set; } 
} 

二、C#对JSON格式数据的解析

引用NewtonsoftJsondll文件,来解析。

比如:有个要解析的JSON字符串

[{"TaskRoleSpaces":"","TaskRoles":"","ProxyUserID":"5d9ad5dc1c5e494db1d1b4d8d79b60a7","UserID":"5d9ad5dc1c5e494db1d1b4d8d79b60a7","UserName":"姓名","UserSystemName":"2234","OperationName":"送合同负责人","OperationValue":"同意","OperationValueText":"","SignDate":"2013-06-19 10:31:26","Comment":"同意","FormDataHashCode":"","SignatureDivID":""},{"TaskRoleSpaces":"","TaskRoles":"","ProxyUserID":"2c96c3943826ea93013826eafe6d0089","UserID":"2c96c3943826ea93013826eafe6d0089","UserName":"姓名2","UserSystemName":"1234","OperationName":"送合同负责人","OperationValue":"同意","OperationValueText":"","SignDate":"2013-06-20 09:37:11","Comment":"同意","FormDataHashCode":"","SignatureDivID":""}]

首先定义个实体类:

public class JobInfo 
{ 
  public string TaskRoleSpaces { get; set; } 
  public string TaskRoles { get; set; } 
  public string ProxyUserID { get; set; } 
  public string UserID { get; set; } 
  public string UserName { get; set; } 
  public string UserSystemName { get; set; } 
  public string OperationName { get; set; } 
  public string OperationValue { get; set; } 
  public string OperationValueText { get; set; } 
  public DateTime SignDate { get; set; } 
  public string Comment { get; set; } 
  public string FormDataHashCode { get; set; } 
  public string SignatureDivID { get; set; } 
} 

然后在控制台Main函数内部输入如下代码:

string json = @"[{'TaskRoleSpaces':'','TaskRoles':'','ProxyUserID':'5d9ad5dc1c5e494db1d1b4d8d79b60a7','UserID':'5d9ad5dc1c5e494db1d1b4d8d79b60a7','UserName':'姓名','UserSystemName':'2234','OperationName':'送合同负责人','OperationValue':'同意','OperationValueText':'','SignDate':'2013-06-19 10:31:26','Comment':'同意','FormDataHashCode':'','SignatureDivID':''},{'TaskRoleSpaces':'','TaskRoles':'','ProxyUserID':'2c96c3943826ea93013826eafe6d0089','UserID':'2c96c3943826ea93013826eafe6d0089','UserName':'姓名2','UserSystemName':'1234','OperationName':'送合同负责人','OperationValue':'同意','OperationValueText':'','SignDate':'2013-06-20 09:37:11','Comment':'同意','FormDataHashCode':'','SignatureDivID':''}] 
"; 
  
      List<JobInfo> jobInfoList = JsonConvertDeserializeObject<List<JobInfo>>(json); 
  
      foreach (JobInfo jobInfo in jobInfoList) 
      { 
        ConsoleWriteLine("UserName:" + jobInfoUserName + "UserID:" + jobInfoUserID); 
      } 

这样就可以正常输出内容了。

我想肯定有人会问,如果有多层关系的json字符串该如何处理呢?没关系,一样的处理。

比如如何解析这个json字符串:[{'phantom':true,'id':'20130717001','data':{'MID':1019,'Name':'aaccccc','Des':'cc','Disable':'启用','Remark':'cccc'}}]  ?

首先还是定义实体类:

public class Info 
{ 
  public string phantom { get; set; } 
  public string id { get; set; } 
  public data data { get; set; } 
} 
 
public class data 
{ 
  public int MID { get; set; } 
  public string Name { get; set; } 
  public string Des { get; set; } 
  public string Disable { get; set; } 
  public string Remark { get; set; } 
} 

然后在main方法里面,键入:

string json = @"[{'phantom':true,'id':'20130717001','data':{'MID':1019,'Name':'aaccccc','Des':'cc','Disable':'启用','Remark':'cccc'}}]"; 
List<Info> infoList = JsonConvertDeserializeObject<List<Info>>(json); 
 
foreach (Info info in infoList) 
{ 
  ConsoleWriteLine("id:" + infodataMID); 
} 

按照我们的预期,应该能够得到1019的结果。

截图为证:

再附一个JSON解析的例子,来自于兔子家族—二哥在本篇博客下的回复。

JSON字符串1:{success:true,data:{id:100001,code:\"JTL-Z38005\",name:\"奥迪三轮毂\",location:\"A-202\",qty:100,bins:[{code:\"JTL-Z38001\",name:\"奥迪三轮毂\",location:\"A-001\",qty:100},{ code:\"JTL-Z38002\",name:\"奥迪三轮毂\",location:\"A-002\",qty:100}]}}

定义数据结构:

public class Data 
 { 
   public Boolean success { get; set; } 
   public Data1 data { get; set; } 
 } 
 
 public class Data1 
 { 
   public Int32 id { get; set; } 
   public string code { get; set; } 
   public string name { get; set; } 
   public string location { get; set; } 
   public Int32 qty { get; set; } 
   public List<Data2> bins { get; set; } 
 } 
 
 public class Data2 
 { 
   public string code { get; set; } 
   public string name { get; set; } 
   public string location { get; set; } 
   public Int32 qty { get; set; } 
 } 

Main函数:

class Program 
  { 
    static void Main(string[] args) 
    { 
      string json = "{success:true,data:{id:100001,code:\"JTL-Z38005\",name:\"奥迪三轮毂\",location:\"A-202\",qty:100,bins:[{code:\"JTL-Z38001\",name:\"奥迪三轮毂\",location:\"A-001\",qty:100},{ code:\"JTL-Z38002\",name:\"奥迪三轮毂\",location:\"A-002\",qty:100}]}}"; 
      Data data = JsonConvertDeserializeObject<Data>(json); 
 
      foreach (var item in datadatabins) 
      { 
        //输出:JTL-Z38001、JTL-Z38002,其它类似 
        ConsoleWriteLine(itemcode); 
      } 
    } 
  } 

JSON字符串2:

 {\"success\":true,\"data\":{\"name\":\"张三\",\"moulds\":{\"stockImport\":true,\"stockExport\":true,\"justifyLocation\":true,\"justifyBin\":false,\"binRelease\":false}}}

在控制台应用程序下的完整代码:

namespace ConsoleApplication1 
{ 
  class Program 
  { 
    static void Main(string[] args) 
    { 
      string json = "{\"success\":true,\"data\":{\"name\":\"张三\",\"moulds\":{\"stockImport\":true,\"stockExport\":true,\"justifyLocation\":true,\"justifyBin\":false,\"binRelease\":false}}}"; 
      Data data = JsonConvertDeserializeObject<Data>(json); 
      ConsoleWriteLine(datadatamouldsbinRelease);//输出False 
    } 
  } 
 
  public class Data 
  { 
    public Boolean success { get; set; } 
    public Data1 data { get; set; } 
  } 
 
  public class Data1 
  { 
    public string name { get; set; } 
    public Data2 moulds { get; set; } 
  } 
 
  public class Data2 
  { 
    public Boolean stockImport { get; set; } 
    public Boolean stockExport { get; set; } 
    public Boolean justifyLocation { get; set; } 
    public Boolean justifyBin { get; set; } 
    public Boolean binRelease { get; set; } 
  } 
} 

JSON字符串3:

{
  "success": true,
  "data": {
    "id": 100001,
    "bin": "JIT-3JS-2K",
    "targetBin": "JIT-3JS-3K",
    "batchs": [
      "B20140101",
      "B20140102"
    ]
  }
}

他的问题主要是不知道batchs这里怎么处理,其实很简单就是一个数组而已。

完整代码如下:

namespace ConsoleApplication1 
{ 
  class Program 
  { 
    static void Main(string[] args) 
    { 
      string json = "{\"success\": true,\"data\": {\"id\": 100001,\"bin\": \"JIT-3JS-2K\",\"targetBin\": \"JIT-3JS-3K\",\"batchs\": [\"B20140101\",\"B20140102\"]}}"; 
      Data data = JsonConvertDeserializeObject<Data>(json); 
 
      foreach (var item in datadatabatchs) 
      { 
        ConsoleWriteLine(item);//输出:B20140101、B20140102 
      } 
    } 
  } 
 
  public class Data 
  { 
    public Boolean success { get; set; } 
 
    public Data1 data { get; set; } 
  } 
 
  public class Data1 
  { 
    public Int32 id { get; set; } 
 
    public string bin { get; set; } 
 
    public string targetBin { get; set; } 
 
    public string[] batchs { get; set; } 
  } 
} 

除了上述返回类的实体对象做法之外,JSONNET还提供了JObject类,可以取自己指定节点的内容。

比如:

namespace ConsoleApplication1 
{ 
  class Program 
  { 
    static void Main(string[] args) 
    { 
      string j = "{success:true,data:{ bin:{code:\"JTL-Z38001\",name:\"奥迪三轮毂\",location:\"A-001\",qty:100}}}"; 
      JObject jo = (JObject)JsonConvertDeserializeObject(j); 
      ConsoleWriteLine(jo); 
    } 
  } 
 
  public class Data 
  { 
    public Boolean success { get; set; } 
    public Data1 data { get; set; } 
  } 
 
  public class Data1 
  { 
    public Data2 bin { get; set; } 
  } 
 
  public class Data2 
  { 
    public string code { get; set; } 
    public string name { get; set; } 
    public string location { get; set; } 
    public Int32 qty { get; set; } 
  } 
} 

直接运行,返回结果如下:

如果输出内容修改为:

ConsoleWriteLine(jo["data"]); 

继续取bin节点。

ConsoleWriteLine(jo["data"]["bin"]); 

最后我们取其中name对应的value。

ConsoleWriteLine(jo["data"]["bin"]["name"]); 

一步一步的获取了JSON字符串对应的Value。

——————————————————————————————————————————————————

群里有人提出一个问题,比如我要生成如下的JSON字符串,该如何处理呢?

{
  "id": 1,
  "value": "cate",
  "child": [
    {
      "id": 1,
      "value": "cate",
      "child": [
        
      ]
    },
    {
      "id": 1,
      "value": "cate",
      "child": [
        {
          "id": 2,
          "value": "cate2",
          "child": [
            {
              "id": 3,
              "value": "cate3",
              "child": [
                
              ]
            }
          ]
        }
      ]
    }
  ]
}

通过观察我们会发现,其实规律比较好找,就是包含id、value、child这样的属性,child又包含id、value、child这样的属性,可以无限循环下去,是个典型的树形结构。

完整的代码如下:

namespace ConsoleApplication1 
{ 
  class Program 
  { 
    static void Main(string[] args) 
    { 
      Data data = new Data(); 
      dataid = 1; 
      datavalue = "cate"; 
      datachild = new List<Data>()  
      {  
        new Data(){ id=1,value="cate",child=new List<Data>(){}} , 
        new Data(){ id=1,value="cate",child=new List<Data>() 
        {  
          new Data() 
          {  
            id=2,  
            value="cate2" ,  
            child = new List<Data>() 
            {  
              new Data() 
              { 
                id = 3, 
                value = "cate3", 
                child = new List<Data>(){}, 
              } 
            }, 
          } 
        }} , 
      }; 
 
      //序列化为json字符串 
      string json = JsonConvertSerializeObject(data); 
      ConsoleWriteLine(json); 
 
      //反序列化为对象 
      Data jsonData = JsonConvertDeserializeObject<Data>(json); 
    } 
  } 
 
  public class Data 
  { 
    public int id { get; set; } 
    public string value { get; set; } 
    public List<Data> child { get; set; } 
  } 
} 

我们验证一下生成的结果:

JObject jo = (JObject)JsonConvertDeserializeObject(json); 
ConsoleWriteLine(jo); 

再来一个复杂点的JSON结构:

[
  {
    "downList": [],
    "line": {
      "Id": -1,
      "Name": "admin",
      "icCard": "1"
    },
    "upList": [
      {
        "endTime": "18:10",
        "startTime": "06:40",
        "sId": 385,
        "sType": "38"
      },
      {
        "endTime": "18:10",
        "startTime": "06:40",
        "sId": 1036,
        "sType": "38"
      }
    ]
  },
  {
    "downList": [],
    "line": {
      "Id": -1,
      "Name": "admin",
      "icCard": "1"
    },
    "upList": [
      {
        "endTime": "18:10",
        "startTime": "06:40",
        "sId": 385,
        "sType": "38"
      },
      {
        "endTime": "18:10",
        "startTime": "06:40",
        "sId": 1036,
        "sType": "38"
      }
    ]
  }
]

namespace ConsoleApplication1 
{ 
  class Program 
  { 
    static void Main(string[] args) 
    { 
      string jsonString = "[{\"downList\": [],\"line\": {\"Id\": -1,\"Name\": \"admin\",\"icCard\": \"1\"},\"upList\": [{\"endTime\": \"18:10\",\"startTime\": \"06:40\",\"sId\": 385,\"sType\": \"38\"},{\"endTime\": \"18:10\",\"startTime\": \"06:40\",\"sId\": 1036,\"sType\": \"38\"}]},{\"downList\": [],\"line\": {\"Id\": -1,\"Name\": \"admin\",\"icCard\": \"1\"},\"upList\": [{\"endTime\": \"18:10\",\"startTime\": \"06:40\",\"sId\": 385,\"sType\": \"38\"},{\"endTime\": \"18:10\",\"startTime\": \"06:40\",\"sId\": 1036,\"sType\": \"38\"}]}]"; 
      Data[] datas = JsonConvertDeserializeObject<Data[]>(jsonString); 
 
      foreach (Data data in datas) 
      { 
        downList[] downList = datadownList; 
        line line = dataline; 
        upList[] upLists = dataupList; 
 
        //输出 
        ConsoleWriteLine(stringJoin(",", lineId, lineName, lineicCard)); 
        foreach (upList upList in upLists) 
        { 
          ConsoleWriteLine(stringJoin(",", upListendTime, upListstartTime, upListsId, upListsType)); 
        } 
        ConsoleWriteLine("-----------------------------------------------"); 
      } 
    } 
  } 
 
 
  public class Data 
  { 
    public downList[] downList { get; set; } 
    public line line { get; set; } 
    public upList[] upList { get; set; } 
  } 
 
  public class downList 
  { 
 
  } 
 
  public class line 
  { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string icCard { get; set; } 
  } 
 
  public class upList 
  { 
    public string endTime { get; set; } 
 
    public string startTime { get; set; } 
 
    public int sId { get; set; } 
 
    public string sType { get; set; } 
  } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 基于使用BeginInvoke,EndInvoke异步调用委托的实现代码

    基于使用BeginInvoke,EndInvoke异步调用委托的实现代码

    本篇文章是对使用BeginInvoke,EndInvoke异步调用委托的实现代码进行了分析介绍,需要的朋友参考下
    2013-05-05
  • C# 枚举类型的声明和使用

    C# 枚举类型的声明和使用

    如果一种变量只有几种可能的值,可以定义为枚举类型。所谓“枚举类型”是将变量的值一一列举出来,变量的值只能在列举出来的值的范围内
    2021-07-07
  • 深入C#字符串和享元(Flyweight)模式的使用分析

    深入C#字符串和享元(Flyweight)模式的使用分析

    本篇文章是对C#字符串与享元(Flyweight)模式的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#使用shell32获取文件属性的方法

    C#使用shell32获取文件属性的方法

    这篇文章主要介绍了C#使用shell32获取文件属性的方法,涉及C#通过shell32获取文件属性的相关技巧,需要的朋友可以参考下
    2015-04-04
  • C#中ManualResetEvent用法详解

    C#中ManualResetEvent用法详解

    这篇文章主要为大家详细介绍了C#中ManualResetEvent用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • C#设计模式编程中运用适配器模式结构实战演练

    C#设计模式编程中运用适配器模式结构实战演练

    这篇文章主要介绍了C#设计模式编程中运用适配器模式结构实战演练,并总结了适配器模式的优缺点和适用场景以及.NET框架中的应用,需要的朋友可以参考下
    2016-02-02
  • 浅谈C#中的Infinity和NaN

    浅谈C#中的Infinity和NaN

    下面小编就为大家带来一篇浅谈C#中的Infinity和NaN。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • c# 如何实现不同进程之间的通信

    c# 如何实现不同进程之间的通信

    这篇文章主要介绍了c# 如何实现不同进程之间的通信,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-11-11
  • C#进度轴控件分享

    C#进度轴控件分享

    这里给大家介绍的是使用C#实现的进度轴的方法和示例,非常的实用,有需要的小伙伴可以参考下。
    2015-06-06
  • C#调用WebService实例开发

    C#调用WebService实例开发

    那么,我们怎么在项目中调用WebService这个方法呢,其实这和调用天气的webservice是一个道理,首先,通过添加“web服务 引用”将,你写的webservice引用进来,我们需要注意的是其中有一处要我们填写请求webservice的URL地址,我们该怎么写?
    2015-09-09

最新评论