详解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; }
  }
}

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

(0)

相关推荐

  • xml 封装与解析(javascript和C#中)

    1.xml的解析(javascript中): 具体代码如下,解析的结果root为Dom树. 复制代码 代码如下: if (window.ActiveXObject){ var doc=new ActiveXObject("Microsoft.XMLDOM"); doc.async="false"; doc.loadXML(strXml); }else{ var parser=new DOMParser(); var doc=parser.parseFromStrin

  • 简介Objective-C解析XML与JSON数据格式的方法

    解析XML 本文以解析本地XML为例,网络获取到的返回值只需转换成NSData型,解析是同理 需要解析的xml文件如下,users.xml <?xml version="1.0" encoding="UTF-8"?> <AllUsers> <message>用户信息</message> <user> <name>芳仔小脚印</name> <age>10</age&g

  • c#中XML解析文件出错解决方法

    1.内容中含有xml预定好的实体,如"<"和"&",对xml来说是禁止使用的,针对这种字符,解决方式是使用CDATA部件以"<![CDATA[" 标记开始,以"]]>"标记结束,是CDATA内部内容被解析器忽略.具体说明参考<XML CDATA是什么?>. 2.内容中含有低位非打印字符,解析时会报错:""(十六进制值 0x1D)是无效的字符.加载或保存XML时引发的异常

  • 详解SpringBoot如何统一后端返回格式

    目录 为什么要对SpringBoot返回统一的标准格式 第一种:返回 String 第二种:返回自定义对象 第三种:接口异常 定义返回标准格式 高级实现方式 接口异常问题 SpringBoot为什么需要全局异常处理器 体验效果 全局异常接入返回的标准格式 今天我们来聊一聊在基于SpringBoot前后端分离开发模式下,如何友好的返回统一的标准格式以及如何优雅的处理全局异常. 首先我们来看看为什么要返回统一的标准格式? 为什么要对SpringBoot返回统一的标准格式 在默认情况下,SpringB

  • 详解 Python 读写XML文件的实例

    详解 Python 读写XML文件的实例 Python 生成XML文件 from xml.dom import minidom # 生成XML文件方式 def generateXml(): impl = minidom.getDOMImplementation() # 创建一个xml dom # 三个参数分别对应为 :namespaceURI, qualifiedName, doctype doc = impl.createDocument(None, None, None) # 创建根元素 r

  • 详解java调用ffmpeg转换视频格式为flv

    详解java调用ffmpeg转换视频格式为flv 注意:下面的程序是在Linux下运行的,如果在windows下rmvb转换成avi会出现问题,想成功需要下载下个drv43260.dll东西放到C:WindowsSystem32下面 这几天在写一个视频管理系统,遇到一个很大的问题就是如果把不同格式转换为flv,格式!经过网上的一番搜索,自己在总结,整理,整理,终于整出来了!实现了视频进行转换的同时还能够进行视频截图和删除原文件的功能! 格式转换主要原理就是先用java调用ffmpeg的exe文件

  • 详解 C# 中XML对象的序列化和反序列化

    这一篇主要是用来介绍关于C#中的XML序列化的问题,这个相信大家一定会经常使用它,特别是在WPF中,有时候我们需要将我们后台的数据保存在数据库中,从而在软件下一次启动的时候能够自动去加载这些数据,由于我们的这些Model中字段众多,如果单独进行保存那是不太现实的,这个时候将这些字段序列化成xml字符串并保存在数据库中就是一个不错的选择,当我们需要这些数据的时候我们也可以反过来将其序列化为一些字段,最终达到我们的效果,首先我们来看看是如何实现的? public class XMLUtil {   

  • 详解如何解决使用JSON.stringify时遇到的循环引用问题

    程序员在日常做TypeScript/JavaScript开发时,经常需要将复杂的JavaScript对象通过JSON.stringify序列化成json字符串,保存到本地以便后续具体分析. 然而如果JavaScript对象本身包含循环引用,则JSON.stringify不能正常工作,错误消息: VM415:1 Uncaught TypeError: Converting circular structure to JSON 解决方案,使用下面这段来自这个网站的代码,定义一个全局cache数组,每

  • 详解SpringBean基于XML的装配

    1.设值注入:通过反射调用setXxx注入属性值 package com.itheima.assemble; import java.util.List; public class User { private String username; private Integer password; private List<String> list; /** * 设值注入 * 提供默认空参构造方法 ; * 为所有属性提供setter方法. */ public User() { super();

  • 详解python实现多张多格式图片转PDF并打包成exe

    目录 转PDF初始代码 转PDF最终代码 GUI界面设计代码 打包成可执行文件 完整代码 附录 转PDF初始代码 从文件夹中读取图片数据,然后将他们保存为PDF格式. 不长,大概10行代码. from PIL import Image from os import * def PictureToPDF(picture_path, name): pictures = [] picture_file = listdir(picture_path) for file in picture_file:

  • 详解配置 Apache 服务器支持 PHP 文件的解析

    详解配置 Apache 服务器支持 PHP 文件的解析 [说明] 1. 本例中 Apache 版本为 httpd-2.4.20-x64-vc14 ,安装路径为 E:\Apache24 2. PHP 版本为 php-5.5.34-Win32-VC11-x64 ,安装路径为 E:\php-5.5.34 [下载] 登录 http://php.NET/downloads.php 下载 PHP,由于我要把它跟 Apache 集成,所以我这里下载的是 Thread Safe 版本: [安装] 1. 解压下载

  • 详解C++11的std::addressof源码解析

    目录 1.源码准备 2.std::addressof简介 3.std::addressof源码解析 4.总结 1.源码准备 本文是基于gcc-4.9.0的源代码进行分析,std::addressof是C++11才加入标准的,所以低版本的gcc源码是没有这个的,建议选择4.9.0或更新的版本去学习,不同版本的gcc源码差异应该不小,但是原理和设计思想的一样的,下面给出源码下载地址 http://ftp.gnu.org/gnu/gcc 2.std::addressof简介 std::addresso

  • 详解VUE调用本地json的使用方法

    开始的时候我以为,用vue去调取json要多么的麻烦,完咯就先去的百度,找了几个,看上面又要配置这配置那的,看的我都头大,像一些思维逻辑清晰的肯定不会出现这种情况. 下面我说下我这的情况,大家依情况代入 当然vue你刚开始创建的话,你是要去配置下东西,下面我说的是你的项目能够跑起来的情况,完咯再去想办法去引用json,当然我这里用的也是axios的获取方法,如果不是这种方法的可以带过了 首先你要知道那你的json应该放在哪个文件夹下(普通引用)如果你想写的有自己的规范,可以按照你自己的方式来.在

随机推荐