Newtonsoft.Json(Json.NET)的核心就两块:JsonConvert 负责实体和 JSON 字符串互转,JObject/JArray 负责动态操作 JSON 节点。 日常开发中掌握序列化、反序列化、动态解析和几个常用配置就够了。
命名空间:using Newtonsoft.Json;、using Newtonsoft.Json.Linq;
两套体系:
- 高级序列化:JsonConvert (实体 ↔ JSON字符串)
- LINQ‑to‑JSON:JObject / JArray / JToken 动态操作JSON节点(你接口中使用的)
一、JsonConvert 实体与字符串互转
1. 实体对象 → JSON字符串
// 对象序列化为JSON字符串
string jsonStr = JsonConvert.SerializeObject(obj);
// 格式化输出(带换行缩进,方便阅读)
string jsonPretty = JsonConvert.SerializeObject(obj, Formatting.Indented);
// 忽略空值、日期格式等配置
var setting = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
NullValueHandling = NullValueHandling.Ignore, // 忽略null属性不输出
DateFormatString = "yyyy‑MM‑dd HH:mm:ss" // 自定义日期格式
};
string json = JsonConvert.SerializeObject(model, setting);
2. JSON字符串 → C#实体对象
// 反序列化到实体 var model = JsonConvert.DeserializeObject(jsonStr); // 反序列化到动态JToken,不指定实体 var jtoken = JsonConvert.DeserializeObject(jsonStr);
二、LINQ‑to‑JSON (JToken/JObject/JArray,动态解析,你接口大量用到)
JToken:所有JSON节点的基类;JObject:JSON对象{ "a":1 }JArray:JSON数组[1,2,3]
1. 从C#对象生成JObject / JArray
// C#实体/字典 → JObject JObject jObj = JObject.FromObject(myModel); // List/数组 → JArray JArray jArr = JArray.FromObject(listDto);
❗坑:List不能传给JObject.FromObject,会报
Object serialized to Array. JObject instance expected.,必须用JArray.FromObject
2. 从JSON字符串解析
// 字符串解析为JObject(要求是{}对象格式)
JObject jObj = JObject.Parse(jsonString);
// 字符串解析为JArray(要求是[]数组格式)
JArray jArr = JArray.Parse(jsonArrayString);
// 万能解析,不知道是对象还是数组,统一拿到JToken
JToken token = JToken.Parse(jsonStr);
3. 读取取值
JObject jo = JObject.Parse("{"name":"test","value":100}");
// 索引取值
string name = jo["name"]?.ToString();
int val = (int)jo["value"];
// 安全取值,防止key不存在报错
string safe = jo["NotExistKey"]?.Value();
// 嵌套读取
string inner = jo["data"]["info"]["msg"]?.ToString();
// JArray遍历
JArray ja = JArray.Parse("[{"v":1},{"v":2}]");
foreach (JToken item in ja)
{
int v = (int)item["v"];
}
4. 修改、新增字段
JObject jo = new JObject();
jo["ExperimentRunStatus"] = JArray.FromObject(dtoList);
jo["Message"] = "ok";
// 删除key
jo.Remove("Message");
5. JToken转回字符串
string jsonOut = jo.ToString(); // 格式化带换行 string jsonCompact = jo.ToString(Formatting.None); // 紧凑无换行(MQTT发送推荐)
6. JToken转为实体
MyModel model = jo.ToObject(); List list = jArr.ToObject>();
三、特性(放在实体属性上)
public class DemoModel
{
// 序列化后的JSON字段名
[JsonProperty("user_name")]
public string UserName { get; set; }
// 序列化时忽略该属性
[JsonIgnore]
public string TempField { get; set; }
}
四、常用JsonSerializerSettings配置(高频)
var settings = new JsonSerializerSettings
{
Formatting = Formatting.Indented, // 缩进美化输出
NullValueHandling = NullValueHandling.Ignore, // 不序列化null的属性
DateFormatHandling = DateFormatHandling.IsoDateFormat,
DateFormatString = "yyyy‑MM‑dd HH:mm:ss",
ReferenceLoopHandling = ReferenceLoopHandling.Ignore, // 解决循环引用报错
};
五、常见坑点整理(你项目遇到过)
-
JObject.FromObject(列表)→ 报错Object serialized to Array,改用JArray.FromObject() -
ValueTuple元组序列化:
ListNewtonsoft会序列化为Item1,Item2,不能直接返回前端,需要中转DTO类。 -
JObject.Parse()传入数组字符串直接抛异常;数组字符串用JArray.Parse() -
jo["key"]不存在返回null,直接(int)jo["key"]会空引用;建议使用?.Value()安全读取。 - MQTT发送JSON报文,调用
ToString(Formatting.None)生成紧凑JSON,减少传输字节。
⚠️ 常见坑
- 列表不能用
JObject.FromObject(),会报错,要用JArray.FromObject()。 -
jo["key"]不存在时返回 null,直接强转会空引用,建议用?.Value()安全读取。 -
JObject.Parse()不能解析数组字符串,数组要用JArray.Parse()。 - 元组序列化会变成 Item1、Item2,直接返回前端不合适,建议中转 DTO 类。
快速记忆对照表
| 功能 | 方法 |
|---|---|
| 实体→JSON字符串 | JsonConvert.SerializeObject(obj) |
| JSON字符串→实体 | JsonConvert.DeserializeObject(str) |
| 对象转JObject | JObject.FromObject(obj) |
| List转JArray | JArray.FromObject(list) |
| JSON字符串解析对象 | JObject.Parse(str) |
| JSON字符串解析数组 | JArray.Parse(str) |
| JObject/JArray输出紧凑JSON | .ToString(Formatting.None) |
如果你需要,我可以写一段示例:动态解析一段不确定结构的JSON,做安全读取。
到此这篇关于Newtonsoft.Json(Json.NET)常用方法总结的文章就介绍到这了,更多相关Newtonsoft Json.NET常用方法内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!
