首页 > 解决方案 > 使用 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 是必要的还是有一些内置的方法来处理它?

标签: c#jsonjson.net

解决方案


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; }
}

推荐阅读