Loading

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

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

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

1、用XMLDocument来解析

XmlDocument xmlDocument = new XmlDocument();  
xmlDocument.Load("test.xml");  
  
//创建新节点   
XmlElement nn = xmlDocument.CreateElement("image");  
nn.SetAttribute("imageUrl", "6.jpg");  
  
XmlNode node = xmlDocument.SelectSingleNode("content/section/page/gall/folder");//定位到folder节点  
node.AppendChild(nn);//附加新节点  
  
//保存  
xmlDocument.Save("test.xml");  

2、用Linq to XML来解析

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

XElement root = XElement.Load("test.xml");  
foreach (XAttribute att in root.Attributes())  
{  
    root.Add(new XElement(att.Name, (string)att));  
}  
Console.WriteLine(root);  

3、附一个详细点的例子

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

<?xml version="1.0" encoding="utf-8"?>  
<Car>  
  <carcost>  
    <ID>20130821133126</ID>  
    <uptime>60</uptime>  
    <downtime>30</downtime>  
    <price>0.4</price>  
  </carcost>  
  <carcost>  
    <ID>20130821014316</ID>  
    <uptime>120</uptime>  
    <downtime>60</downtime>  
    <price>0.3</price>  
  </carcost>  
  <carcost>  
    <ID>20130822043127</ID>  
    <uptime>30</uptime>  
    <downtime>0</downtime>  
    <price>0.5</price>  
  </carcost>  
  <carcost>  
    <ID>20130822043341</ID>  
    <uptime>120以上!</uptime>  
    <downtime>120</downtime>  
    <price>0.2</price>  
  </carcost>  
</Car>  

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

class Program  
{  
    static void Main(string[] args)  
    {  
        IList<CarCost> resultList = new List<CarCost>();  
  
        XmlDocument xmlDocument = new XmlDocument();  
        xmlDocument.Load("test.xml");  
  
        XmlNodeList xmlNodeList = xmlDocument.SelectSingleNode("Car").ChildNodes;  
        foreach (XmlNode list in xmlNodeList)  
        {  
            CarCost carcost = new CarCost  
            (  
                list.SelectSingleNode("ID").InnerText,  
                list.SelectSingleNode("uptime").InnerText,  
                list.SelectSingleNode("downtime").InnerText,  
                float.Parse(list.SelectSingleNode("price").InnerText)  
            );  
            resultList.Add(carcost);  
        }  
  
        IEnumerator enumerator = resultList.GetEnumerator();  
        while (enumerator.MoveNext())  
        {  
            CarCost carCost = enumerator.Current as CarCost;  
            Console.WriteLine(carCost.ID + " " + carCost.UpTime + " " + carCost.DownTime + " " + carCost.Price);  
        }  
    }  
}  
  
public class CarCost  
{  
    public CarCost(string id, string uptime, string downtime, float price)  
    {  
        this.ID = id;  
        this.UpTime = uptime;  
        this.DownTime = downtime;  
        this.Price = price;  
    }  
    public string ID { get; set; }  
    public string UpTime { get; set; }  
    public string DownTime { get; set; }  
    public float Price { get; set; }  
} 

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

引用Newtonsoft.Json.dll文件,来解析。

比如:有个要解析的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 = JsonConvert.DeserializeObject<List<JobInfo>>(json);  
   
            foreach (JobInfo jobInfo in jobInfoList)  
            {  
                Console.WriteLine("UserName:" + jobInfo.UserName + "UserID:" + jobInfo.UserID);  
            }  

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

我想肯定有人会问,如果有多层关系的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 = JsonConvert.DeserializeObject<List<Info>>(json);  
  
foreach (Info info in infoList)  
{  
    Console.WriteLine("id:" + info.data.MID);  
}  

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

截图为证:

另外,对于有些json格式不是标准的,可以使用通用的方法进行解析。

string jsonText = @" {'Count':1543,'Items':[{'UnitID':6119,'UnitName':'C'}]}";  
JsonReader reader = new JsonTextReader(new StringReader(jsonText));  
while (reader.Read())  
{  
    Console.WriteLine(reader.TokenType + "\t\t" + reader.ValueType + "\t\t" + reader.Value);  
}  

附Newtonsoft.Json.dll下载地址:下载吧

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

再附一个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 = JsonConvert.DeserializeObject<Data>(json);  
  
           foreach (var item in data.data.bins)  
           {  
               //输出:JTL-Z38001、JTL-Z38002,其它类似  
               Console.WriteLine(item.code);  
           }  
       }  
   }  

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 = JsonConvert.DeserializeObject<Data>(json);  
            Console.WriteLine(data.data.moulds.binRelease);//输出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 = JsonConvert.DeserializeObject<Data>(json);  
  
            foreach (var item in data.data.batchs)  
            {  
                Console.WriteLine(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; }  
    }  
}  

除了上述返回类的实体对象做法之外,JSON.NET还提供了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)JsonConvert.DeserializeObject(j);  
            Console.WriteLine(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; }  
    }  
}  

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

如果输出内容修改为:

Console.WriteLine(jo["data"]); 

继续取bin节点。

Console.WriteLine(jo["data"]["bin"]);  

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

Console.WriteLine(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();  
            data.id = 1;  
            data.value = "cate";  
            data.child = 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 = JsonConvert.SerializeObject(data);  
            Console.WriteLine(json);  
  
            //反序列化为对象  
            Data jsonData = JsonConvert.DeserializeObject<Data>(json);  
        }  
    }  
  
    public class Data  
    {  
        public int id { get; set; }  
        public string value { get; set; }  
        public List<Data> child { get; set; }  
    }  
}

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

JObject jo = (JObject)JsonConvert.DeserializeObject(json);  
Console.WriteLine(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 = JsonConvert.DeserializeObject<Data[]>(jsonString);  
  
            foreach (Data data in datas)  
            {  
                downList[] downList = data.downList;  
                line line = data.line;  
                upList[] upLists = data.upList;  
  
                //输出  
                Console.WriteLine(string.Join(",", line.Id, line.Name, line.icCard));  
                foreach (upList upList in upLists)  
                {  
                    Console.WriteLine(string.Join(",", upList.endTime, upList.startTime, upList.sId, upList.sType));  
                }  
                Console.WriteLine("-----------------------------------------------");  
            }  
        }  
    }  
  
  
    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; }  
    }  
} 

 

posted @ 2013-09-17 12:51  guwei4037  阅读(995)  评论(0编辑  收藏  举报