zoukankan      html  css  js  c++  java
  • C#操作JSON学习

    JSON(全称为JavaScript Object Notation) 
    是一种轻量级的数据交换格式。它是基于JavaScript语法标准的一个子集。
    JSON采用完全独立于语言的文本格式,可以很容易在各种网络、平台和程序之间传输。JSON的语法很简单,易于人阅读和编写,同时也易于机器解析和生
    成。

    JSON与XML的比较
    ◆可读性
    JSON和XML的可读性相比较而言,由于XML提供辅助的标签,更加适合人阅读和理解。
    ◆文件大小与传输
    XML允许使用方便的标签,所以文件尺寸是要比JSON大的。而且JSON源于Javascript,所以天生的主战场是Javascript与网络,在这里,JSON有着XML无法赶超的优势。

    JSON语法
    1. JSON 语法是 JavaScript 对象表示法语法的子集。
    •数据在名称/值对中:名称是字符串,使用双引号表示。值可以是:数字(整数或浮点数),字符串(在双引号中),数组(在方括号中),对象(在花括号中),true/false/null。
    •数据由逗号分隔:
    •花括号保存对象:对象可以包含各种数据,包括数组。
    •方括号保存数组:数字可以包含对象。

    例如:

    {
    "employees": [
    {
    "firstName": "Bill",
    "lastName": "Gates"
    },
    {
    "firstName": "George",
    "lastName": "Bush"
    }
    ]
    }

    2. 如果JSON中含有转义字符,则需要转义。例如文件路径中需要使用"\"而不是""。例如:{ "file":"C:\a.txt"}。

    .NET操作JSON
    JSON文件读入到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串。操作JSON通常有以下几种方式:
    1. 原始方式:自己按照JSON的语法格式,写代码直接操作JSON字符串。如非必要,应该很少人会走这条路,从头再来的。
    2. 通用方式:这种方式是使用开源的类库Newtonsoft.Json(下载地址http://json.codeplex.com/)。下载后加入工程就能用。通常可以使用JObject, JsonReader, JsonWriter处理。这种方式最通用,也最灵活,可以随时修改不爽的地方。
    (1)使用JsonReader读Json字符串:

    string jsonText = @"{""input"" : ""value"", ""output"" : ""result""}";
    JsonReader reader = new JsonTextReader(new StringReader(jsonText));

    while (reader.Read())
    {
    Console.WriteLine(reader.TokenType + " " + reader.ValueType + " " + reader.Value);
    }

    (2)使用JsonWriter写字符串:

    StringWriter sw = new StringWriter();
    JsonWriter writer = new JsonTextWriter(sw);

    writer.WriteStartObject();
    writer.WritePropertyName("input");
    writer.WriteValue("value");
    writer.WritePropertyName("output");
    writer.WriteValue("result");
    writer.WriteEndObject();
    writer.Flush();

    string jsonText = sw.GetStringBuilder().ToString();
    Console.WriteLine(jsonText);

    (3)使用JObject读写字符串:

    JObject jo = JObject.Parse(jsonText);
    string[] values = jo.Properties().Select(item => item.Value.ToString()).ToArray();

    (4)使用JsonSerializer读写对象(基于JsonWriter与JsonReader):

    Project p = new Project() { Input = "stone", Output = "gold" };
    JsonSerializer serializer = new JsonSerializer();
    StringWriter sw = new StringWriter();
    serializer.Serialize(new JsonTextWriter(sw), p);
    Console.WriteLine(sw.GetStringBuilder().ToString());

    StringReader sr = new StringReader(@"{""Input"":""stone"", ""Output"":""gold""}");
    Project p1 = (Project)serializer.Deserialize(new JsonTextReader(sr), typeof(Project));
    Console.WriteLine(p1.Input + "=>" + p1.Output);

    上面的代码都是基于下面这个Project类定义:

    class Project
    {
    public string Input { get; set; }
    public string Output { get; set; }
    }

    此外,如果上面的JsonTextReader等类编译不过的话,说明是我们自己修改过的类,换成你们自己的相关类就可以了,不影响使用。
    3. 内置方式:使用.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工程中用感觉有点浪费资源。
    此外,从最后一句也可以看到,序列化与反序列化是深拷贝的一种典型的实现方式。

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

    Project p = new Project() { Input = "stone", Output = "gold" };
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(p.GetType());
    string jsonText;

    using (MemoryStream stream = new MemoryStream())
    {
    serializer.WriteObject(stream, p);
    jsonText = Encoding.UTF8.GetString(stream.ToArray());
    Console.WriteLine(jsonText);
    }

    using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonText)))
    {
    DataContractJsonSerializer serializer1 = new DataContractJsonSerializer(typeof(Project));
    Project p1 = (Project)serializer1.ReadObject(ms);
    Console.WriteLine(p1.Input + "=>" + p1.Output);
    }

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

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

    实用参考:
    JSON验证工具:http://jsonlint.com/
    JSON简明教程:http://www.w3school.com.cn/json/
    Newtonsoft.Json类库下载:http://json.codeplex.com/


    --------------下面这段文章很好----------

      首先,大家要明白什么是json,了解更多关于json方面资料大家可以点击https://www.ibm.com/developerworks/cn/web/wa-lo-json/ ,我在这里简单介绍下json:

        JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互。和 XML 一样,JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的,因此,JSON 的数据格式非常简单,您可以用 JSON 传输一个简单的 String,Number,Boolean,也可以传输一个数组,或者一个复杂的 Object 对象。

         在.NET环境下面,我们使用Json.net来实现JSON数据的序列化和反序列化。

         首先点击连接http://sourceforge.net/projects/csjson/?source=dlp 下载JSON .NET插件和代码。

         然后在项目中进行引用Newtonsoft.Json.dll

         添加命名空间:using Newtonsoft.Json;

         下面介绍json序列化和反序列化的放个重要方法和例子:

    JsonConvert.SerializeObject(object value)序列化,它有个重载方法JsonConvert.SerializeObject(object value, params JsonConverter[] converters)。
    JsonConvert.DeserializeObject(string value, Type type),反序列化,它有个重载方法JsonConvert.DeserializeObject(string value, Type type, params JsonConverter[] converters)
    这两个方法可以实现基本的序列化和反序列化要求,请看下面的例子:

    首先我们先建一个Person类代码如下:

      public class Person
        {
            private string name;
            public string Name
            {
                get { return name; }
                set { name = value; }
            }

            private int age;
            public int Age
            {
                get { return age; }
                set { age = value; }
            }
        }

    1)序列化

     using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Newtonsoft.Json;

    namespace JSONnet
    {
        public partial class test : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                Person person = new Person();
                person.Name = "GoldenEasy";
                person.Age = 25;
                string strSerializeJSON = JsonConvert.SerializeObject(person);
                Response.Write(strSerializeJSON);                     

            }
        }
    }

    输出结果:

    {"Name":"GoldenEasy","Age":25}

    2)反序列化

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Newtonsoft.Json;

    namespace JSONnet
    {
        public partial class test : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                Person person = new Person();
                person.Name = "GoldenEasy";
                person.Age = 25;
                string strSerializeJSON = JsonConvert.SerializeObject(person);           
                Person user = (Person)JsonConvert.DeserializeObject(strSerializeJSON, typeof(Person));
                Response.Write(user.Name);
             

            }
        }
    }

    输出结果为:GoldenEasy

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    以下文章转载 http://www.cnblogs.com/TankXiao/p/3637495.html#generateJSON

    C#操作JSON

    RestAPI中, 经常需要操作json字符串,  需要把json字符串"反序列化"成一个对象, 也需要把一个对象"序列化"成一字符串。

    C# 操作json,  比较简单。  本文介绍几种方法

    步骤

    Json 字符串 反序列化成对象 共需要2步:

    第一步:建立相应的实体类

    第二步: 调用方法把Json字符串"反序列化"成对象

    了解json的语法

    首先要了解json的语法,这样才能知道怎么创建实体类.

    Json 的语法很简单, 就四条

    • 数据在名称/值对中
    • 数据由逗号分隔
    • 花括号保存对象
    • 方括号保存数组

    创建实体类的例子

    {"FirstName":"小坦克","LastName":"Tank","Age":30}

    相应的实体类可以为

    复制代码
        public class Person 
        {
            public String FirstName
            { get; set; }
    
            public String LastName
            { get; set; }
    
            public int Age
            { get; set; }
        }
    复制代码

     

    自动生成JSON的实体类

    一个复杂的实体类,我们自己去写的话,可能需要1个小时以上。 那有没有工具能直接生成实体类呢,这样能方便太多了。  当然有

    http://jsonclassgenerator.codeplex.com/  ----开源的winform工具。

    
    

    使用第三方工具 Newtonsoft.Json.dll

    优点:  使用非常方便.   看个例子就知道怎么用了

    下载地址   http://james.newtonking.com/json

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Newtonsoft.Json;
    
    namespace JsonDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                string personJson = "{ 'FirstName': '小坦克','LastName':'Tank xiao', 'Age':'30', 'Books':[{'BookName':'c#', 'Price':'29.9'},{'BookName':'Mac编程', 'Price':'39.9'}]}";
    
                string allMoveJson = @"[{ 'FirstName': '小坦克','LastName':'Tank xiao', 'Age':'30', 'Books':[{'BookName':'c#', 'Price':'29.9'},{'BookName':'Mac编程', 'Price':'39.9'}]},{
                                  'FirstName': '小坦克2','LastName':'Tank xiao2', 'Age':'40', 'Books':[{'BookName':'c#', 'Price':'29.9'},{'BookName':'Mac编程', 'Price':'39.9'}]}]";
    
                // 反序列化 单个对象
                Person oneMovie = JsonConvert.DeserializeObject<Person>(personJson);
    
                // 反序列化 对象集合
                List<Person> allMovie = JsonConvert.DeserializeObject<List<Person>>(allMoveJson);
    
                Console.WriteLine(oneMovie.FirstName);
                Console.WriteLine(allMovie[1].FirstName);
    
                // 序列化
                string afterJson = JsonConvert.SerializeObject(allMovie);
            }
        }
    
    
        public class Person
        {
            public String FirstName
            { get; set; }
    
            public String LastName
            { get; set; }
    
            public int Age
            { get; set; }
    
            public List<Book> Books
            { get; set; }
        }
    
        public class Book
        {
            public string BookName
            { get; set; }
    
            public string Price
            { get; set; }
        }
    }

     -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    C# Json序列化工具  Newtonsoft.Json简介和使用

    Newtonsoft.Json,是.Net中开源的Json序列化和反序列化工具,官方地址:http://www.newtonsoft.com/json

    功能比较多,效率比较高,官方给出对比数据

    50% faster than DataContractJsonSerializer, and 250% faster than JavaScriptSerializer.

    比较常用的功能除了序列化反序列化之外,还有 Linq To Json、Json Path、 XML support等

    更多详情参考:http://www.newtonsoft.com/json/help/html/JsonNetVsDotNetSerializers.htm

    使用方法简单:

    使用命令

    Install-Package Newtonsoft.Json

    或者右键,项目》Nuget包管理,添加 
    简答使用实例如下:

    1.定义类:

    /// <summary>
    /// 学生信息实体
    /// </summary>
    public class Student
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public Class Class { get; set; }
    }
    /// <summary>
    /// 学生班级实体
    /// </summary>
    public class Class
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
    2.序列化,反序列化 实体对象,实体集合,匿名对象:

    Student stu = new Student();
    stu.ID = 1;
    stu.Name = "张三";
    stu.Class = new Class() { ID = 0121, Name = "CS0121" };
    
    //使用方法1
    //实体序列化、反序列化
    //结果:{"ID":1,"Name":"张三","Class":{"ID":121,"Name":"CS0121"}}
    string json1 = JsonConvert.SerializeObject(stu);
    Console.WriteLine(json1);
    Student stu2 = JsonConvert.DeserializeObject<Student>(json1);
    Console.WriteLine(stu2.Name + "---" + stu2.Class.Name);
    
    //实体集合,序列化和反序列化
    List<Student> stuList = new List<Student>() { stu, stu2 };
    string json2 = JsonConvert.SerializeObject(stuList);
    Console.WriteLine(json2);
    List<Student> stuList2 = JsonConvert.DeserializeObject<List<Student>>(json2);
    foreach (var item in stuList2)
    {
        Console.WriteLine(item.Name + "----" + item.Class.Name);
    }
    
    //匿名对象的解析,
    //匿名独享的类型  obj.GetType().Name: "<>f__AnonymousType0`2"
    var obj = new { ID = 2, Name = "李四" };
    string json3 = JsonConvert.SerializeObject(obj);
    Console.WriteLine(json3);
    object obj2 = JsonConvert.DeserializeAnonymousType(json3, obj);
    Console.WriteLine(obj2.GetType().GetProperty("ID").GetValue(obj2));
    object obj3 = JsonConvert.DeserializeAnonymousType(json3, new { ID = default(int), Name = default(string) });
    Console.WriteLine(obj3.GetType().GetProperty("ID").GetValue(obj3));
    //匿名对象解析,可以传入现有类型,进行转换
    Student stu3 = new Student();
    stu3 = JsonConvert.DeserializeAnonymousType(json3, new Student());
    Console.WriteLine(stu3.Name);
    更多内容可以参考博客  http://www.cnblogs.com/freshman0216/p/4161800.html

  • 相关阅读:
    java中map接口hashMap以及Enty之间的用法和关系
    Collection集合总结,List和set集合的用法,HashSet和LinkedHashSetde用法
    微信小程序开发攻略
    Java闰年的计算,Calendar的用法
    Java计算计算活了多少天
    Java用代码演示String类中的以下方法的用法
    Java判断一个字符串中有多少大写字母、小写字母和数字
    Java将一个字符串的首位改为大写后边改为小写的实现,String
    Java 获取一个字符串中,另一个字符串出现的次数
    linux下重命名文件或文件夹(linux)
  • 原文地址:https://www.cnblogs.com/wphl-27/p/5786136.html
Copyright © 2011-2022 走看看