使用JsonConvert序列化JsonObject格式不符,如何通过JsonSerializerSettings修正?
问题解答
不能仅通过配置JsonSerializerSettings解决这个问题,本质原因是你混用了两个不同的JSON处理库:
JsonConvert.SerializeObject是**Newtonsoft.Json(Json.NET)**的APIJsonObject是System.Text.Json库中的节点类型
Newtonsoft.Json无法识别System.Text.Json的JsonObject内部结构,会将其当作普通.NET对象序列化,因此输出了_value、Value这些内部属性。
解决方案一:使用System.Text.Json自带的序列化方法
既然你用的是System.Text.Json的JsonObject,直接用该库的JsonSerializer.Serialize方法即可得到简洁格式:
using System.Text.Json; using System.Text.Json.Nodes; var jsonString = JsonSerializer.Serialize(objx, new JsonSerializerOptions { WriteIndented = false // 对应Newtonsoft的Formatting.None,需要缩进则设为true });
解决方案二:为Newtonsoft.Json自定义转换器(如果必须用Newtonsoft)
如果因为某些原因必须使用Newtonsoft.Json,可以编写自定义转换器来正确处理JsonObject,然后添加到JsonSerializerSettings中:
首先定义转换器:
using Newtonsoft.Json; using System.Text.Json.Nodes; public class JsonObjectConverter : JsonConverter<JsonObject> { public override JsonObject ReadJson(JsonReader reader, Type objectType, JsonObject existingValue, bool hasExistingValue, JsonSerializer serializer) { // 若不需要反序列化,可保留此抛出;需要的话可自行实现逻辑 throw new NotImplementedException("反序列化逻辑未实现"); } public override void WriteJson(JsonWriter writer, JsonObject value, JsonSerializer serializer) { writer.WriteStartObject(); foreach (var kvp in value) { writer.WritePropertyName(kvp.Key); // 递归序列化节点值 serializer.Serialize(writer, kvp.Value?.GetValue<object>()); } writer.WriteEndObject(); } }
然后在序列化时配置转换器:
var jsonString = JsonConvert.SerializeObject(objx, Formatting.None, new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore, Converters = { new JsonObjectConverter() } });
内容的提问来源于stack exchange,提问作者MrMustafa022
相关产品推荐
相关产品推荐

