•   欢迎来到21NN网.
  •   请记住本站网址www.21nn.cn

C#剖析json文件的完成代码【C#.Net教程】,C# json

摘要: C#剖析json  JSON(全称为JavaScriptObjectNotation)是一种轻量级的数据交换花样。它是基于JavaScript语法规范的一个子集。JSON采纳完整独...
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):

数组型数据

string jsonArrayText1 = "[{'a':'a1','b':'b1'},{'a':'a2','b':'b2'}]";
JArray ja = (JArray)JsonConvert.DeserializeObject(jsonArrayText1);
string ja1a = ja[1]["a"].ToString();
//或许
JObject o = (JObject)ja[1];
string oa = o["a"].ToString();

嵌套花样

string jsonText = "{\"beijing\":{\"zone\":\"海淀\",\"zone_en\":\"haidian\"}}";
JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText);
string zone = jo["beijing"]["zone"].ToString();
string zone_en = jo["beijing"]["zone_en"].ToString();

自定义类Project

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; }
}

更多C#剖析json文件的完成代码相干文章请关注ki4网!

分享到:

发表评论

评论列表

还没有评论,快来说点什么吧~

公众号二维码

微信公众号