C# 中JsonWriter的使用

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的语法格式,写代码直接操作JSON字符串。如非必要,应该很少人会走这条路,从头再来的。
JSON文件读入到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串。.NET操作JSON通用方式:
通常可以使用JObject, JsonReader, JsonWriter处理Json。这种方式最通用,也最灵活。

首先要添加Json.Net插件, 参考 https://docs.microsoft.com/zh-cn/nuget/tools/package-manager-ui

备注: 

如果您缺少 Visual Studio 2015 中的 NuGet 包管理器,请检查工具 > 扩展和更新...并搜索NuGet 包管理器扩展。

即下图package install,下载安装:

 如果你无法使用 Visual Studio 中的扩展安装程序,下载直接从扩展https://dist.nuget.org/index.html

在 Visual Studio 2017,NuGet 和 NuGet 包管理器将自动安装与任意。提供与.NET 相关的工作负荷。 通过选择单独安装它各个组件 > 代码工具 > NuGet 包管理器在 Visual Studio 2017 安装程序中的选项。

 

查找和安装的包

    1. 在解决方案资源管理器,右键单击引用或某个项目并选择管理 NuGet 包....
    2.  

    3. 浏览选项卡显示由从当前所选的源的受欢迎程度包 (请参阅包源)。 搜索特定包在左上方使用搜索框。 从列表以显示其信息,还可以选择包安装以及版本选择的下拉列表的按钮。
    4.  

    5. 从下拉列表中选择所需的版本,然后选择安装。 Visual Studio 在项目中安装包和其依赖项。 你可能会要求以接受许可条款。 安装完成后,添加的包会出现在已安装选项卡。包也会列在引用的解决方案资源管理器,如下图所示,你可以参考它们具有项目中的节点using语句。
    6.  

Newtonsoft.Json安装完成后就可以使用JsonWriter了。

 

(1)使用JsonReader读Json字符串:
   string jsonText = @"{""p1"" : ""v1"", ""p2"" : ""v2""}";
            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();
            foreach (var i in values)
            {
                Console.WriteLine("\t\t" + i);
            }
            string input = jo["input"].ToString();
            Console.WriteLine("\t" + input);
            string output = jo["output"].ToString();
            Console.WriteLine("\t" + output);

            jo["input"] = "resetValue";
            string reInput = jo["input"].ToString();
            Console.WriteLine("\t" + reInput);

 

 

(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; }
    }
2. 内置方式:使用.NET Framework 3.5/4.0中提供的System.Web.Script.Serialization命名空间下的JavaScriptSerializer类进行对象的序列化与反序列化,很直接。
3.契约方式:使用System.Runtime.Serialization.dll提供的DataContractJsonSerializer或者 JsonReaderWriterFactory实现。
在使用DataContractJsonSerializer进行解析之前,我们首先需要将包引入进来:

 

代码引入:

using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

 

举例代码:

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

请注意上述class中的DataContract和DataMember这两个属性,因为DataContractJsonSerializer在进行序列化的时候需要他们,所以一定要记得加上。

 

 

转载自 http://www.cnblogs.com/txw1958/archive/2012/08/01/csharp-json.html





 

posted @ 2018-03-15 18:04  记忆留樱  阅读(2217)  评论(0编辑  收藏  举报