c#_Json

Posted x1angzeeD.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#_Json相关的知识,希望对你有一定的参考价值。

一、Json的自我介绍

JSON(javascript Object Notation) 是一种轻量级的数据交换格式。可读性和XML的可读性可谓不相上下,也有着XML无法比拟的可扩展性。

1、格式:为对象、[]为数组

      1、对象是一个无序的“‘名称/值’对”集合。
      例子:表示人的一个对象:
      "姓名" : "大憨","年龄" : 24
      2、数组是值(value)的有序集合。
      例子:一组学生
      "学生" :["姓名" : "小明" , "年龄" : 23,"姓名" : "大憨" , "年龄" : 24]
      json 对象数组:["姓名" : "小明" , "年龄" : 23,"姓名" : "大憨" , "年龄" : 24]
      3、值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
      4、字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。 字符串   (string)与C或者Java的字符串非常相似。
      5、数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。

2、附上两个格式化校验网址

http://www.bejson.com/

http://tool.chinaz.com/tools/jsonescape.aspx

二、Json的准备工作(添加引用)

一共有两种添加引用的方式:

如果你有时间的话,这里有一个B站的视频(这个视频的美式中文真的很搞,不过讲的还可以),没时间的话我把关键点都整理好了,继续往下看吧!

 1、解决方案→添加引用→引用System.Web.Extensions

需要using这俩伙计:

举个小栗子:

string JSONstr = File.ReadAllText("JSON.json");
JavaScriptSerializer ser = new JavaScriptSerializer();
Person p1 = ser.Deserialize<Person>(JSONstr);          

2、项目→管理NuGet程序包→Newtonsoft.Json

它是一个静态工具,所以不需要使用new关键词

这时你需要using这俩货:

栗子:

string JSONstr = File.ReadAllText("JSON.json");
Person p1 = JsonConvert.DeserializeObject<Person>(JSONstr);

三、Json 读取、添加、删除、修改

    #region Create (从零创建)
        public static string CreateFromZero()
        
            StringBuilder jsonText = new StringBuilder();
            StringWriter sw = new StringWriter(jsonText);
 
            using (JsonWriter writer = new JsonTextWriter(sw))
            
                writer.Formatting = Formatting.None;
                writer.WriteStartObject();//
                #region children
                writer.WritePropertyName("children");
                writer.WriteStartArray();//[ 
 
                writer.WriteStartObject();//
                writer.WritePropertyName("children");
                writer.WriteStartArray();//[ 
 
                writer.WriteStartObject();//
                writer.WritePropertyName("organizationCode");
                writer.WriteValue("grandson");
                writer.WritePropertyName("organizationName");
                writer.WriteValue("孙子节点");
                writer.WriteEndObject();//  
 
                writer.WriteEndArray();//] 
 
                writer.WritePropertyName("organizationCode");
                writer.WriteValue("son");
                writer.WritePropertyName("organizationName");
                writer.WriteValue("子节点");
                writer.WriteEndObject();//  
 
                writer.WriteEndArray();//] 
                #endregion
                writer.WritePropertyName("organizationCode");
                writer.WriteValue("root");
                writer.WritePropertyName("organizationName");
                writer.WriteValue("根节点");
 
                writer.WriteEndObject();//  
 
            
            return jsonText.ToString();
        
 
        #endregion
 
        #region Delete ,Update (删除指定节点 + 在指定节点前后添加 + 修改节点)
        public static string OperateNode()
        
            string jsonText = CreateFromZero();
            //string jsonText = File.ReadAllText(FilePath, Encoding.Default);
            JToken jobject = JObject.Parse(jsonText);
            #region 新节点
            StringBuilder jsonTextNew = new StringBuilder();
            StringWriter sw = new StringWriter(jsonTextNew);
 
            using (JsonWriter writer = new JsonTextWriter(sw))
            
                writer.Formatting = Formatting.None;
                writer.WriteStartObject();//
                writer.WritePropertyName("organizationCode");
                writer.WriteValue("newson");
                writer.WritePropertyName("organizationName");
                writer.WriteValue("新节点");
                writer.WriteEndObject();//  
            
            #endregion
 
            JToken jobjectNew = JObject.Parse(jsonTextNew.ToString());
 
            string[] field = new string[]  "孙子节点" ;
            List<JToken> removeNodes = new List<JToken>();
            GetRemoveNodes(jobject, field, ref removeNodes);
            foreach (JToken node in removeNodes)
            
                JToken nodeObj = node.Parent;
                //nodeObj.Remove();  //删除此节点
 
                //nodeObj.AddAfterSelf(jobjectNew); //在此节点后添加 json 对象
                //nodeObj.AddBeforeSelf(jobjectNew);//在此节点前添加 json 对象
                nodeObj.Replace(jobjectNew);  //修改此节点, 通过替换实现
 
            
 
 
            return jobject.ToString();
        
        private static void GetRemoveNodes(JToken token, string[] fields, ref List<JToken> removeNodes)
        
            JContainer container = token as JContainer;
            if (container == null) return;
 
            foreach (JToken el in container.Children())
            
                JProperty p = el as JProperty;
                if (p != null && fields.Contains(p.Value.ToString()))
                
                    removeNodes.Add(el);
                
                GetRemoveNodes(el, fields, ref removeNodes);
            
 
        
        #endregion
 
        #region Retrieve (查询)
        //官网例子比较好:
        //http://www.newtonsoft.com/json/help/html/QueryingLINQtoJSON.htm
        #endregion

 

 

以上是关于c#_Json的主要内容,如果未能解决你的问题,请参考以下文章

Unknown Treasure (卢卡斯 + 孙子定理, 模板题)

是否可以仅使用 CSS 选择元素的绝对最后一个孙子? [复制]

按猫鼬中的孙子属性过滤

面向对象之成员修饰符

c#_Json

c#_Json