最常用:
1 2
| Jsonconvert.SerializeObject(Class); JsonConvert.DeserializeObject<Class>(json);
|
1、实体类的Json序列化和反序列化
常用数据类型
1 2 3 4 5 6 7
| public int ID{get;set} public string Name{get;set;} public DateTime Birthday{get;set} public bool IsVIP{get;set} public float Account{get;set;} public string[] Favourites{get;set} public string Remark{get;set;}
|
创建一个Person实例
1 2 3 4 5 6 7 8 9
| Person person = new Person { ID=1, Name="张三", Birthday=DateTime.Parse("2000-01-02"), IsVIP=true, Account=12.34f, Favorites=new string[] {"吃饭","睡觉"} }
|
1.1 Json序列化
返回不缩进的Json字符串
1
| Jsonconvert.SerializeObject(person);
|
1
| {"ID":1,"Name":"张三","Birthday":"2000-01-02T00:00:00","IsVIP":true,"Account":12.34,"Favorites":["吃饭","睡觉"],"Remark":null}
|
返回缩进的Json字符串
1
| JsonConvert.SerializeObject(person, Formatting.Indented);
|
1 2 3 4 5 6 7 8 9 10 11 12
| { "ID": 1, "Name": "张三", "Birthday": "2000-01-02T00:00:00", "IsVIP": true, "Account": 12.34, "Favorites": [ "吃饭", "睡觉" ], "Remark": null }
|
在json序列化中动态忽略某些属性或字段
在字段前加上[JsonIgnore]
,字段在序列化时会被忽略
也可以使用[ShouldSerialize]
使其能够被序列化(对于有seald开放性的属性能生效)
C#在Json序列化中动态忽略某些属性或字段 - 威少小二orz - 博客园 (cnblogs.com)
1.2 将不缩进的JSON字符串转成缩进格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| private string JsonIndentation(string str) { JsonSerializer serializer = new JsonSerializer(); TextReader tr = new StringReader(str); JsonTextReader jtr = new JsonTextReader(tr); object obj = serializer.Deserialize(jtr); if (obj != null) { StringWriter textWriter = new StringWriter(); JsonTextWriter jsonWriter = new JsonTextWriter(textWriter) { Formatting = Formatting.Indented, Indentation = 4, IndentChar = ' ' }; serializer.Serialize(jsonWriter, obj); return textWriter.ToString(); } else { return str; } }
|
或者:
1 2 3 4 5
| private string JsonIndentation(string json) { JObject obj = JObject.Parse(json); return obj.ToString(); }
|
1.3、其他设置
1 2 3 4 5 6 7 8 9
| JsonSerializerSettings settings = new JsonSerializerSettings();
settings.DateFormatString = "yyyy-MM-dd";
settings.NullValueHandling = NullValueHandling.Ignore;
settings.Formatting = Formatting.Indented; JsonConvert.SerializeObject(person, settings);
|
返回:
1 2 3 4 5 6 7 8 9 10 11
| { "ID": 1, "Name": "张三", "Birthday": "2000-01-02", "IsVIP": true, "Account": 12.34, "Favorites": [ "吃饭", "睡觉" ] }
|
1.4、Json反序列化
1
| JsonConvert.DeserializeObject<Person>(json);
|
2、Jobject使用
2.1、创建对象
1 2 3 4 5 6 7 8 9 10 11 12
| JObject obj = new JObject(); obj.Add("ID", 11); obj.Add("Name", "张三1"); obj.Add("Birthday", DateTime.Parse("2020-11-02")); obj.Add("IsVIP", true); obj.Add("Account", 13.34f);
JArray array = new JArray(); array.Add(new JValue("上班")); array.Add(new JValue("下班")); obj.Add("Favorites", array); obj.Add("Remark", null);
|
2.2、JObject中添加数组
上例中的代码可以简化为:
1
| JArray array = new JArray("上班", "下班");
|
2.3、从Json字符串创建JObject
1
| string json = "{\"ID\":11,\"Name\":\"张三1\",\"Birthday\":\"2020-11-02T00:00:00\",\"IsVIP\":true,\"Account\":13.34,\"Favorites\":[\"上班\",\"下班\"],\"Remark\":null}";
|
1
| JObject obj = JObject.Parse(json);
|
2.4、从Entity创建JObject
1
| JObject obj = JObject.FromObject(person);
|
用匿名对象创建 JObject
1
| JObject obj = JObject.FromObject(new { name = "jack", age = 28 });
|
1 2 3 4 5
| { "name": "jack", "age": 18 }
|
用初始化器
1 2 3 4 5
| JObject obj = new JObject() { { "name", "jack" }, { "age", 28 } };
|
2.5、获取值
1 2 3
| int id; if (obj["ID"] != null) id = obj["ID"].Value<int>();
|
2.6、获取数组
Newtonsoft.Json.Linq 不支持直接获取数组,但是可以获取 List,然后再转化为数组。
1 2 3
| string[] favorites; if (obj["Favorites"] != null) favorites = obj["Favorites"].Value<List<string>>().ToArray();
|