zoukankan      html  css  js  c++  java
  • .NET下解析Json的方法

    .NET下几种常见的解析JSON方法
    主要类命名空间限制内建LINQ支持
    DataContractJsonSerializer System.Runtime.Serialization.Json 通用
    JavaScriptSerializer System.Web.Script.Serialization 只能在Web环境使用
    JsonArrayJsonObjectJsonValue System.Json 只能在Silverlight中使用
    JsonConvertJArrayJObjectJValueJProperty Newtonsoft.Json 通用

    DoNet2.0 需要借助于开源的类库Newtonsoft.Json.dll

    代码
    
    using System;
    using System.IO;
    using System.Text;
    using Newtonsoft.Json;
    
    namespace OfflineAcceptControl.UCTools
    {
        public class JsonTools
        {
            // 从一个对象信息生成Json串
            public static string ObjectToJson(object obj)
            {
               return JavaScriptConvert.SerializeObject(obj);
            }
            // 从一个Json串生成对象信息
            public static object JsonToObject(string jsonString, object obj)
            {
               return JavaScriptConvert.DeserializeObject(jsonString, obj.GetType());
            }
        }
    }
    

      

    内置方式:使用.NET Framework 3.5/4.0中提供的System.Web.Script.Serialization命名空间下的JavaScriptSerializer类进行对象的序列化与反序列化,很直接。

    Project p = new Project() { Input = "stone", Output = "gold" };
     JavaScriptSerializer serializer = new JavaScriptSerializer();
     var json = serializer.Serialize(p);
     Console.WriteLine(json);
    
     var p1 = serializer.Deserialize<Project>(json);
     Console.WriteLine(p1.Input + "=>" + p1.Output);
     Console.WriteLine(ReferenceEquals(p,p1));
    

    注意:如果使用的是VS2010,则要求当前的工程的Target Framework要改成.Net Framework 4,不能使用Client Profile。当然这个System.Web.Extensions.dll主要是Web使用的,直接在Console工程中用感觉有点浪费资源。
      此外,从最后一句也可以看到,序列化与反序列化是深拷贝的一种典型的实现方式

    契约方式:使用System.Runtime.Serialization.dll提供的DataContractJsonSerializer或者 JsonReaderWriterFactory实现  

    注意引用:System.Runtime.Serialization,System.ServiceModel.Web

    代码
    
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Json;
    
    namespace CrjIIOfflineAccept.CrjIITools
    {
        public class JsonTools
        {
            // 从一个对象信息生成Json串
            public static string ObjectToJson(object obj)
            {
               DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
               MemoryStream stream = new MemoryStream();
               serializer.WriteObject(stream, obj);
               byte[] dataBytes = new byte[stream.Length];
               stream.Position = 0;
               stream.Read(dataBytes, 0, (int)stream.Length);
               return Encoding.UTF8.GetString(dataBytes);
            }
            // 从一个Json串生成对象信息
            public static object JsonToObject(string jsonString, object obj)
            {
               DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
               MemoryStream mStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
               return serializer.ReadObject(mStream);
            }
        }
    }
    

     这里要注意,这里的Project类和成员要加相关的Attribute:

    [DataContract]
    class Project
    {
        [DataMember]
        public string Input { get; set; }
        [DataMember]
        public string Output { get; set; }
    }
    

      将类及类变量的访问权限全改为public。

    实用参考:
    JSON验证工具:http://jsonlint.com/
    JSON简明教程:http://www.w3school.com.cn/json/

  • 相关阅读:
    [AGC019F] Yes or No
    [CF1063F]String Journey
    [Gym100490A] Approximation
    [ARC058C]Iroha and Haiku
    [互测题目]大括号树
    [UVA10859]放置街灯 Placing Lampposts
    PAT甲级1141PAT Ranking of Institutions
    PAT甲级1153Decode Registration Card of PAT
    使用Python语言通过PyQt5和socket实现UDP服务器
    数据结构-哈希
  • 原文地址:https://www.cnblogs.com/jzxx/p/5621194.html
Copyright © 2011-2022 走看看