.Net中处理JSON

首先JSON不允许包含空格等特殊符号的,可以通过以下2中方法去掉:

(1)string test1 = result.Replace(" ", "");//去掉result里面的空格

(2) string test = Regex.Replace(result, @"\s", "");//去掉空格回车等特殊字符

 

准备工作

需要引用

System.Web.Extensions.dll 这个类库

命名空间:

System.Web.Script.Serialization

数据结构

1
2
3
4
5
6
7
8
9
10
public class Team
{
    public string Name { getset; }
    public List<User> Users { getset; }
}
public class User
{
    public int Id { getset; }
    public string Name { getset; }
}

Class --> JSON

1
2
3
4
5
6
7
8
9
10
11
12
            JavaScriptSerializer js = new JavaScriptSerializer();
            Team team = new Team()
            {
                Name = "梦之队",
                Users = new List<User>() { 
                     new User() { Id = 1, Name = "XXX" },
                      new User() { Id = 2, Name = "YYY" },
                       new User() { Id = 3, Name = "ZZZ" },
                    }
            };
            string json = js.Serialize(team);
            Console.WriteLine(json);

输出结果

1
2
{"Name":"梦之队","Users":[{"Id":1,"Name":"XXX"},{"Id":2,"Name":"YYY"},{"Id":3,"N
ame":"ZZZ"}]}

Json --> Class

1
2
3
            string json = "{\"Name\":\"梦之队\",\"Users\":[{\"Id\":1,\"Name\":\"XXX\"},{\"Id\":2,\"Name\":\"YYY\"},{\"Id\":3,\"Name\":\"ZZZ\"}]}";
            JavaScriptSerializer js = new JavaScriptSerializer();
            Team team = js.Deserialize<Team>(json);

测试结果略

 

 

2014.9.18更新

JSON.NET(Newtonsoft.Json)

官方地址:http://www.newtonsoft.com/json

序列化

1
2
3
4
5
6
7
8
9
10
            Team team = new Team() 
            
                Name = "梦之队"
                Users = new List<User>() {  
                     new User() { Id = 1, Name = "XXX" }, 
                      new User() { Id = 2, Name = "YYY" }, 
                       new User() { Id = 3, Name = "ZZZ" }, 
                    
            }; 
            string json = JsonConvert.SerializeObject(team);

反序列化

1
            var jsonTeam= JsonConvert.DeserializeObject<Team>(json);

另外,JSON.NET还有一种比较好用的方式,按照索引器访问

1
2
3
4
            string json = "{\"Name\":\"梦之队\",\"Users\":[{\"Id\":1,\"Name\":\"XXX\"},{\"Id\":2,\"Name\":\"YYY\"},{\"Id\":3,\"Name\":\"ZZZ\"}]}";
            JObject jobject = JsonConvert.DeserializeObject(json) as JObject;
            Console.WriteLine(jobject["Name"]); //使用索引器访问 
            Console.WriteLine(jobject["Users"][0]["Name"]);

 

 

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 + "\t\t" + reader.ValueType + "\t\t" + 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/
posted @ 2015-01-26 17:13  往日的雨幽  阅读(354)  评论(0编辑  收藏  举报