一、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://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