【问题标题】:Deserializing via JSON.NET with Variable Property Name使用可变属性名称通过 JSON.NET 反序列化
【发布时间】:2017-08-23 00:24:57
【问题描述】:

给定一些看起来像的 json

{
  "id":"123_678",
  "fs_123_678":
   {
     "title":"Apple Parts",
     "data": 134
   }
}

我想将其反序列化为以下类

public class Result
{
   public string Id {get; set;}
   public ResultInfo Info {get; set;}
}

public class ResultInfo
{
   public string Title {get; set;}
   public int Data {get; set;}
}

...但是第二个属性 (fs_123_678) 不是固定名称。我在这里查看了关于 SO 的其他类似帖子,常见的解决方案是使用 IDictionary<string, MyPoco> 但是,这仅在变量数据 not 在根级别时才有效。 属性的名称是 100% 可预测的,我可以根据源 HTTP 请求中使用的值在代码中描述给定 JSON 响应的名称。诀窍是,我如何让 JSON 反序列化器参与到业务规则中,围绕这个给定的反序列化将调用什么?我基本上需要类似[JsonProperty(PropertyName = *insert logic here*)] 的东西(这当然是不可能的)。

什么是处理这个问题的合理方法,同时保留对象其余部分的“免费”强类型反序列化?

【问题讨论】:

标签: c# json json.net json-deserialization


【解决方案1】:

根据dbc 在 cmets 中提供的链接,我发现这个解决方案看起来很实用,但对其他建议持开放态度。我基本上采用当前的阅读器流,将其加载为 JObject,然后将原始 JProperty 替换为另一个具有我的模型所期望的名称的名称。

public class MyCustomResultConverter : JsonConverter
{
    public override bool CanWrite => false;
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var obj = JObject.Load(reader);
        var formData = obj.SelectToken("fs_" + obj.SelectToken("id").Value<string>());
        formData.Parent.Replace(new JProperty("info", formData));

        existingValue = existingValue ?? new FormActionResult();
        serializer.Populate(obj.CreateReader(), existingValue);
        return existingValue;
    }

    public override bool CanConvert(Type objectType)
    {
        return typeof(Result).GetTypeInfo().IsAssignableFrom(objectType);
    }
}

[JsonConverter(typeof(MyCustomResultConverter))]
public class Result
{
   public string Id {get; set;}
   public ResultInfo Info {get; set;}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    相关资源
    最近更新 更多