C# 处理JSON


Json序列化之.NET开源类库Newtonsoft.Json的研究
 一、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
  • 数据由逗号分隔:
  • 花括号保存对象:对象可以包含各种数据,包括数组。
  • 方括号保存数组:数字可以包含对象。
  
例如:
{
     "student" : [
         {
             "firstName" : "Bill" ,
             "lastName" : "Gates"
         },
         {
             "grade" : "3" ,
             "sex" : "boy"
         }
     ]
}
 
 二、Json的序列化和反序列化
 
方式一:从头开始,自己写方法
  Json的格式并不复杂,序列化和反序列化我们完全可以自己来写一套方法来处理Json。但是如果没有特殊业务需求,没有人会这样做,毕竟随着项目的推进,这个方法可能会变得越来越复杂。
 
方法二:使用开源类库
  下面跟大家推荐一款.NET中开源的Json序列化和反序列化类库,Newtonsoft.Json(下载地址 http://json.codeplex.com/)。打开网站如下:
 
点击Download,即可下载次类库。下载完成后,解压完成后可以看到如下目录:
打开Bin目录,会看到不同版本的dll文件,这里我选择Net40,复制Newtonsoft.Json.dll和Newtonsoft.Json.xml到项目下面。最常用的是JObject, JsonReader, JsonWriter来处理Json字符串,这几种方式比较灵活。下面我们来建一个项目来介绍一下Newtonsoft.Json的具体用法。
 
 
 三、实战Json序列化和反序列化
 
1、解析Json(反序列化)
 
  打开VS,新建控制台项目JsonWithNewtonsoft,这里我用的是VS2013,然后建立文件夹library来放我们引用的dll,建好的项目结构如下图:
 
然后我们添加引用 using Newtonsoft.Json;下面我们来看看怎么使用吧!是不是此刻心情很激动啊~~呵呵,先来看看怎么读取Json吧,我们自己写一个Json字符串,来解析一下,这里给出几种用法,大家根据自己爱好选择。
上代码,先来看第一种读取Json的写法,顺序读取:
复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.IO;
using Newtonsoft.Json.Linq;

namespace JsonWithNewtonsoft
{
    class Program
    {
        static void Main(string[] args)
        {
            string jsonText = @"{""Name"" : ""Jack"", ""Age"" : ""22""}";
            JsonReader reader = new JsonTextReader(new StringReader(jsonText));

            while (reader.Read())
            {
                Console.WriteLine(reader.TokenType + "\t" + reader.ValueType + "\t" + reader.Value);
            }
            Console.Read();
        }
    }
}
复制代码
 其输出内容如下:
 
 
可以看到,他是顺序解析Json,首先输出Json开始标志StartObject,然后依次输出Json的内容。
 
 下面来看第二种解析Json的方法:
复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.IO;
using Newtonsoft.Json.Linq;

namespace JsonWithNewtonsoft
{
    class Program
    {
        static void Main(string[] args)
        {
            string jsonText = @"{""Name"" : ""Jack"", ""Age"" : ""22""}";

            JObject jo = JObject.Parse(jsonText);
            string[] values = jo.Properties().Select(item => item.Name.ToString() + ":" + item.Value.ToString()).ToArray();
            foreach(string s in values)
            {
                Console.WriteLine(s);
            }
            Console.Read();
        }
    }
}
复制代码

这里使用JObject来解析Json数据,可以看到这里使用linq取出了Json的Name和Value属性,然后将结果赋给values数组,输出结果如下:

这就是解析Json的两种方法,一种是使用StringReader,一种是使用JObject。

 

解析数组型数据

到这里Json解析就完了?当然没完!这只是解析最基本的Json数据格式,下面来看下解析数组格式的Json数据,代码如下:

复制代码
            //数组型数据
            string jsonArrayText1 = "[{'Name':'Tom','Age':'16'},{'Name':'Mary','Age':'15'}]";
            JArray ja = (JArray)JsonConvert.DeserializeObject(jsonArrayText1);

            string name1 = ja[1]["Name"].ToString();
            Console.WriteLine(name1);
            //或者
            JObject o = (JObject)ja[1];
            string name2 = o["Name"].ToString();
            Console.WriteLine(name2);
复制代码

这里我们定义了两个学生,这里使用JArray这个类型,可以看到,他和数组的用法很像。当然还可以转换成JObject类型,然后再进行取值操作。

 

解析嵌套性数据

还有一种Json格式,是嵌套格式,来看下如何解析吧。代码如下:

           //嵌套格式
            jsonText = "{\"shanghai\":{\"zone\":\"浦东\",\"zone_en\":\"pudong\"}}";
            jo = (JObject)JsonConvert.DeserializeObject(jsonText);
            string zone = jo["shanghai"]["zone"].ToString();
            string zone_en = jo["shanghai"]["zone_en"].ToString();

代码很简单,我就不过多的解释了。

到这里,读取和解析Json的内容就讲完了,下面我们来说一下序列化,就是生成Json的方法。

 

2、序列化Json

  先来看一下通用的生成Json的方法吧!就来输出{"Name":"Jack","Age":"26"}代码如下:

复制代码
       //输出{"Name":"Jack","Age":"26"}
            StringWriter sw = new StringWriter();
            JsonWriter writer = new JsonTextWriter(sw);
            writer.WriteStartObject();
            writer.WritePropertyName("Name");
            writer.WriteValue("Jack");
            writer.WritePropertyName("Age");
            writer.WriteValue("26");
            writer.WriteEndObject();
            writer.Flush();

            jsonText = sw.GetStringBuilder().ToString();
            Console.WriteLine(jsonText);
复制代码

这段代码运行后就是输出{"Name":"Jack","Age":"26"},很简单吧!

  下面来添加一个Student类,代码如下,然后对其进行序列化,Student代码:

 public class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

下面来new一个Student,并进行序列化和反序列化,代码如下:

复制代码
            Student stu = new Student() { Name = "Jack", Age = 20 };
            JsonSerializer serializer = new JsonSerializer();
            sw = new StringWriter();
            serializer.Serialize(new JsonTextWriter(sw), stu);
            Console.WriteLine(sw.GetStringBuilder().ToString());

            StringReader sr = new StringReader(sw.GetStringBuilder().ToString());
            Student s = (Student)serializer.Deserialize(new JsonTextReader(sr), typeof(Student));
            Console.WriteLine(s.Name + "=>" + s.Age);
复制代码

其输出结果如下:

下面来序列化一个Student列表,看看得到什么,代码如下:

复制代码
        List<Student> students = new List<Student>();
            Student stu = new Student() { Name = "Jack", Age = 20 };
            Student stu1 = new Student() { Name = "Tom", Age = 21 };
            students.Add(stu);
            students.Add(stu1);
            JsonSerializer serializer = new JsonSerializer();
            sw = new StringWriter();
            serializer.Serialize(new JsonTextWriter(sw), students);
            Console.WriteLine(sw.GetStringBuilder().ToString());
复制代码

运行结果如下:

看到这个,很熟悉吧,前面刚刚说过怎么解析这种格式的Json!当然,你们还有一种嵌套形式怎么生成呢?下面来修改Studnet类,添加电话号码字段,修改后的Student类如下:

复制代码
    public class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public List<string> Phones { get; set; }

    }
复制代码

序列化代码如下:

复制代码
        List<Student> students = new List<Student>();
            Student stu = new Student() { Name = "Jack", Age = 20, Phones = new List<string> {"1455655888","15236988985" }};
            Student stu1 = new Student() { Name = "Tom", Age = 21, Phones = new List<string> { "1325889684", "15236988985" }};
            students.Add(stu);
            students.Add(stu1);
            JsonSerializer serializer = new JsonSerializer();
            sw = new StringWriter();
            serializer.Serialize(new JsonTextWriter(sw), students);

            Console.WriteLine(sw.GetStringBuilder().ToString());
复制代码

输出Json如下:

看到了吧,是不是前面说到的嵌套类型。解析方法前面也说过了。到这里,Newtonsoft.Json这个类库的使用就讲完了,当然他还有很多其他的功能等待着大家去发现。


<think>首先,用户的问题是关于C#处理JSON数据的方法和示例。我需要基于系统级指令来构建我的回答。系统级指令要点:-所有行内数学表达式必须使用$...$格式。-独立公式必须使用$$...$$格式并单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-在回答中引用的段落末尾自然地添加引用标识,例如[^1]。-回答结构清晰,帮助用户逐步解决问题。-参考站内引用:引用[1]、[2]、[3]提供了关于C#处理JSON的示例代码。用户的问题:我想使用C#处理JSON数据的方法或技术请问C#处理JSON数据的方法和示例我的回答需要:1.使用中文。2.结构清晰:逐步解释C#处理JSON的方法。3.包括示例代码:从引用中提取或创建相关示例。4.添加引用标识:在引用站内内容时添加[^1]、[^2]、[^3]。5.生成相关问题:在结尾部分添加相关问题。分析站内引用:-引用[1]:使用JsonConvert.SerializeObject将C#对象序列化为JSON字符串。-引用[2]:使用JsonConvert.DeserializeObject将JSON字符串反序列化为C#对象。-引用[3]:使用JArray处理JSON数组。这些引用来自Newtonsoft.Json库(也称为Json.NET),这是C#处理JSON的流行库。回答结构:-**引言**:简要介绍C#处理JSON的常用方法。-**步骤1:序列化**:将C#对象转换为JSON字符串,使用引用[1]的示例。-**步骤2:反序列化**:将JSON字符串转换为C#对象,使用引用[2]的示例。-**步骤3:使用JArray处理数组**:基于引用[3]的示例。-**其他方法**:简要提及其他库或内置方法(如System.Text.Json)。-**总结**:强调最佳实践。-**相关问题**:生成3-5个相关问题。确保LaTeX:用户的问题不涉及数学表达式,但如果有需要,我会遵守指令。这里主要是代码示例,所以可能不需要数学LaTeX。引用标识:-当使用引用中的内容时,在末尾添加[^1]、[^2]、[^3]。最终输出:-以用户可见层开始。-回答主体。-§§相关问题§§部分。相关问题生成:-基于主题,如性能优化、错误处理、库比较等。完整回答框架:1.**介绍**:C#处理JSON通常使用Newtonsoft.Json库,现在也有System.Text.Json。2.**序列化示例**:展示如何序列化对象到JSON。3.**反序列化示例**:展示如何反序列化JSON到对象。4.**处理数组**:展示JArray的使用。5.**代码示例**:包括代码块。6.**相关问题**:如“如何优化JSON序列化性能?”、“如何处理嵌套JSON?”等。</think>### C# 处理 JSON 数据的方法和示例 在 C#处理 JSON 数据是常见的需求,主要用于数据序列化(将对象转换为 JSON 字符串)和反序列化(将 JSON 字符串转换为对象)。Newtonsoft.Json(也称为 Json.NET)是最常用的库,它功能强大且易于使用。此外,C# 从 .NET Core 3.0 开始引入了内置的 `System.Text.Json` 库,它更轻量级且性能更好。下面我将逐步介绍核心方法和示例代码,确保结构清晰易懂。所有代码示例基于 Newtonsoft.Json,因为它在实际项目中应用广泛[^1][^2][^3]。 #### 步骤 1: 安装 Newtonsoft.Json 库 在开始前,需通过 NuGet 安装 Newtonsoft.Json: - 在 Visual Studio 中:打开 NuGet 包管理器,搜索 "Newtonsoft.Json" 并安装。 - 使用 .NET CLI:运行命令 `dotnet add package Newtonsoft.Json`。 #### 步骤 2: JSON 序列化(对象转 JSON 字符串) 序列化是将 C# 对象转换为 JSON 字符串的过程。使用 `JsonConvert.SerializeObject` 方法,它支持自定义格式化(如缩进)。以下是一个完整示例,基于引用[^1]: ```csharp using Newtonsoft.Json; // 定义数据模型类 public class Person { public string Name { get; set; } public int Age { get; set; } public bool IsStudent { get; set; } } // 序列化示例 Person person = new Person { Name = "John", Age = 30, IsStudent = false }; string json = JsonConvert.SerializeObject(person); Console.WriteLine(json); // 输出: {"Name":"John","Age":30,"IsStudent":false} ``` - **解释**:这里创建了一个 `Person` 对象,并序列化为 JSON 字符串。输出是紧凑格式的 JSON。如果需要美化输出(带缩进),可以添加参数:`JsonConvert.SerializeObject(person, Formatting.Indented)`[^1]。 #### 步骤 3: JSON 反序列化(JSON 字符串转对象) 反序列化是将 JSON 字符串还原为 C# 对象。使用 `JsonConvert.DeserializeObject<T>` 方法,其中 `T` 是目标类型。参考引用[^2],这是一个通用方法: ```csharp using Newtonsoft.Json; // 反序列化示例 public T JsonDeserialize<T>(string jsonString) { return JsonConvert.DeserializeObject<T>(jsonString); } // 使用示例 string jsonInput = "{\"Name\":\"Alice\",\"Age\":25,\"IsStudent\":true}"; Person deserializedPerson = JsonDeserialize<Person>(jsonInput); Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}"); // 输出: Name: Alice, Age: 25 ``` - **解释**:该方法将 JSON 字符串解析为 `Person` 对象。反序列化时需确保 JSON 结构与类属性匹配,否则会抛出异常[^2]。 #### 步骤 4: 处理 JSON 数组 对于数组或列表数据,Newtonsoft.Json 提供了 `JArray` 类来动态操作 JSON 数组。基于引用[^3],示例代码如下: ```csharp using Newtonsoft.Json.Linq; using System.Collections.Generic; // 创建字符串列表并转换为 JArray List<string> stringList = new List<string> { "s1", "s2" }; JArray listArr = new JArray(stringList); Console.WriteLine(listArr.ToString()); // 输出: ["s1","s2"] // 解析 JSON 数组字符串 string jsonArray = "[\"item1\", \"item2\", \"item3\"]"; JArray parsedArray = JArray.Parse(jsonArray); foreach (var item in parsedArray) { Console.WriteLine(item); // 输出: item1, item2, item3 } ``` - **解释**:`JArray` 允许动态访问和修改 JSON 数组元素,适用于复杂或不固定结构的 JSON 数据[^3]。 #### 其他方法和注意事项 - **使用 System.Text.Json(内置库)**:如果你使用 .NET Core 3.0 或更高版本,可以考虑 `System.Text.Json`。它更高效,但功能较少。示例: ```csharp using System.Text.Json; var json = JsonSerializer.Serialize(person); var obj = JsonSerializer.Deserialize<Person>(json); ``` - **错误处理**:在反序列化时,使用 `try-catch` 块处理无效 JSON: ```csharp try { var obj = JsonConvert.DeserializeObject<Person>(jsonString); } catch (JsonException ex) { Console.WriteLine($"解析错误: {ex.Message}"); } ``` - **性能优化**:对于大数据量,使用 `JsonSerializerSettings` 配置选项(如忽略空值)。 #### 总结 C# 处理 JSON 的核心方法是序列化和反序列化,Newtonsoft.Json 是首选库,支持灵活的数据操作。内置的 `System.Text.Json` 适合高性能场景。实践中,确保数据模型与 JSON 结构一致以避免错误[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值