Newtonsoft.Json库

最常用

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)
{
//string str = JsonConvert.SerializeObject(entity);
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();

Newtonsoft.Json库
https://newztx.github.io/2024/07/24/Newtonsoft.Json/
作者
Cranky Dove
发布于
2024年7月24日
许可协议