gpt4 book ai didi

c# - Json.NET 不在对象的列表或字典中保留原始类型信息。有解决方法吗?

转载 作者:太空狗 更新时间:2023-10-29 22:08:05 24 4
gpt4 key购买 nike

以下示例说明了 Json.NET 类型处理中的一个基本缺陷:

List<object> items = new List<object>() {Guid.NewGuid(),DateTime.Now};
var settings = new JsonSerializerSettings() { TypeNameHandling=TypeNameHandling.All };
var json = JsonConvert.SerializeObject<List<object>>(value,settings);

产生以下 JSON:

{"$type":"System.Collections.Generic.List`1[[System.Object, mscorlib]], mscorlib","$values":["9d7aa4d3-a340-4cee-baa8-6af0582b8acd","2014-07-28T21:03:17.1287029-04:00"]}

如您所见,列表项已丢失其类型信息。反序列化相同的 JSON 将生成一个仅包含字符串的列表。

此问题之前已在 codeplex 上报告过并被敷衍了事,指出包含类型信息会使 JSON 过于困惑。令我惊讶的是,我们没有提供单独的选项来为往返一致性被破坏的情况包含原始类型信息。

https://json.codeplex.com/workitem/23833

我希望数据返回时带有与它留下时相同的类型信息。是否有人有任何建议或解决方法来纠正这种不良行为?

谢谢,

克里斯

最佳答案

这是一个使用自定义 JsonConverter 的解决方案:

public sealed class PrimitiveJsonConverter : JsonConverter
{
public PrimitiveJsonConverter()
{

}

public override bool CanRead
{
get
{
return false;
}
}

public override bool CanConvert(Type objectType)
{
return objectType.IsPrimitive;
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
switch (serializer.TypeNameHandling)
{
case TypeNameHandling.All:
writer.WriteStartObject();
writer.WritePropertyName("$type", false);

switch (serializer.TypeNameAssemblyFormat)
{
case FormatterAssemblyStyle.Full:
writer.WriteValue(value.GetType().AssemblyQualifiedName);
break;
default:
writer.WriteValue(value.GetType().FullName);
break;
}

writer.WritePropertyName("$value", false);
writer.WriteValue(value);
writer.WriteEndObject();
break;
default:
writer.WriteValue(value);
break;
}
}
}

使用方法如下:

JsonSerializerSettings settings = new JsonSerializerSettings() 
{
TypeNameHandling = TypeNameHandling.All,
};

settings.Converters.Insert(0, new PrimitiveJsonConverter());
return JsonConvert.SerializeObject(myDotNetObject, settings);

我目前正在使用此解决方案序列化 IDictionary<string, object>可以包含原语的实例。

关于c# - Json.NET 不在对象的列表或字典中保留原始类型信息。有解决方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25007001/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com