c# - 使用 Newtonsoft Json.Net 反序列化字符串化(引号括起来)嵌套对象
问题描述
与使用 Jackson 反序列化字符串化(带引号的)嵌套对象相同的问题,但针对 C# 和 Newtonsoft Json.Net。问题是如何使用 Json.Net 反序列化 JSON 的嵌套字符串表示。来自 REST 端点的示例响应:
{
"Id": "abcd1234",
"Foo": "{\"field1\": "abc", \"field2\": \"def\"}"
}
C# 模型:
public class Model {
public Guid Id { get; set; }
public Dictionary<string, string> Foo { get; set; }
}
只是调用JsonConvert.DeserializeObject<Model>(returnedJson)
会出错,因为返回形式的 Foo 是字符串化的 JSON,也就是一个字符串。我们的 JSON 响应中的其他字段也是如此,它们的模型中关联了不同的 Dictionary 类型(例如 Dictionary<string, int> 和 Dictionary<string, DateTime>)。
处理这个最简单的方法是什么?自定义 JsonConverter 是必要的还是有一些内置的方法来处理它?
解决方案
A JsonConverter 可能是处理这种隐式转换的最简单方法。这是适合您的情况的一种。
public class MyConverter: JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(string);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return JsonConvert.DeserializeObject(reader.Value as string, objectType);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
然后你用这样的属性装饰那个属性:
public class Model
{
public string Id { get; set; }
[JsonConverter(typeof(MyConverter))]
public Dictionary<string, string> Foo { get; set; }
}
推荐阅读
- rest - 绕过 JQL 的长度限制
- machine-learning - 为什么yolo检测不到图像中的所有物体?
- kotlin - Kotlin 未解决的参考:removeAt
- c++ - c++中如何区分0和NULL
- python - 如何运行一组 celery 任务?应用尚未加载
- python - (py)mongo BulkUpdate 基于过滤器的数组中的元素
- replace - JavaScript 刽子手,放置字母
- ios - 如何同步 AVPlayer 和 MTKView
- javascript - 为什么 outerHeight 没有在 chrome 中返回正确的值?
- reactjs - ReactJS 如何处理这个引用 DOM