Newtonsoft.Json用法总结
c#中可以引用第三方组件Newtonsoft.Json进行json数据的操作,首先在项目中引入组件库:
然后再NuGet中搜索安装Newtonsoft.Json
1、 实体类的 Json 序列化和反序列化
我们以如下的 Person 类举例,其中包含了常用的数据类型:
public class Person
{
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[] Favorites { get; set; }
public string Remark { get; set; }
}
创建一个 Person 实例:
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 字符串
JsonConvert.SerializeObject(person);
{"ID":1,"Name":"张三","Birthday":"2000-01-02T00:00:00","IsVIP":true,"Account":12.34,"Favorites":["吃饭","睡觉"],"Remark":null}
返回缩进的 Json 字符串
JsonConvert.SerializeObject(person, Formatting.Indented);
{
"ID": 1,
"Name": "张三",
"Birthday": "2000-01-02T00:00:00",
"IsVIP": true,
"Account": 12.34,
"Favorites": [
"吃饭",
"睡觉"
],
"Remark": null
}
1.2、 将不缩进的 JSON 字符串转成缩进形式
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;
}
}
或者:
private string JsonIndentation(string json)
{
JObject obj = JObject.Parse(json);
return obj.ToString();
}
1.3 、其他设置
JsonSerializerSettings settings = new JsonSerializerSettings();
// 设置日期格式
settings.DateFormatString = "yyyy-MM-dd";
// 忽略空值
settings.NullValueHandling = NullValueHandling.Ignore;
// 缩进
settings.Formatting = Formatting.Indented;
JsonConvert.SerializeObject(person, settings);
返回:
{
"ID": 1,
"Name": "张三",
"Birthday": "2000-01-02",
"IsVIP": true,
"Account": 12.34,
"Favorites": [
"吃饭",
"睡觉"
]
}
1.4、 Json 反序列化
JsonConvert.DeserializeObject<Person>(json);
2 、JObject 使用
2.1、 创建对象
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 中添加数组
上例中的代码可以简化为:
JArray array = new JArray("上班", "下班");
2.3、 从 Json 字符串创建 JObject
string json = "{\"ID\":11,\"Name\":\"张三1\",\"Birthday\":\"2020-11-02T00:00:00\",\"IsVIP\":true,\"Account\":13.34,\"Favorites\":[\"上班\",\"下班\"],\"Remark\":null}";
JObject obj = JObject.Parse(json);
2.4 、从 Entity 创建 JObject
JObject obj = JObject.FromObject(person);
用匿名对象创建 JObject
JObject obj = JObject.FromObject(new { name = "jack", age = 28 });
//显示
{
"name": "jack",
"age": 18
}
用初始化器
JObject obj = new JObject()
{
{ "name", "jack" },
{ "age", 28 }
};
2.5、 获取值
int id;
if (obj["ID"] != null)
id = obj["ID"].Value<int>();
2.6、 获取数组
Newtonsoft.Json.Linq 不支持直接获取数组,但是可以获取 List,然后再转化为数组。
string[] favorites;
if (obj["Favorites"] != null)
favorites = obj["Favorites"].Value<List<string>>().ToArray();