【问题标题】:Parsing versioned JSON解析版本化的 JSON
【发布时间】:2014-04-23 15:07:35
【问题描述】:

我有两个不同的 Json 表示的对象:

JSON v1:

{
 "names":[{"name":John},{"name":Eve}],
 "version": 1
}

JSON v2:

{
  "names":[{"name":"John", "age":22},{"name":"Eve", "age":35}],
  "version": 2
}

现在我有了可以解析第一个版本的 Json 的类:

[JsonObject("Class")]
public class PeopleEntity
{
    public string name{ get; set; }
}

public class People
{
  public List<PeopleEntity> names{ get; set; }
  public string version{ get; set; }

}

这就是它的解析方式:

  result = JsonConvert.DeserializeObject<People>(json_data, new     JsonSerializerSettings
                        {
                            DefaultValueHandling = DefaultValueHandling.Ignore
                        });

现在,问题是,解析第二版 JSON 的请求来了。处理这个问题的最佳解决方案是什么?

我有一个想法来制作接口列表(因为属性名称总是存在的)并对其进行多个实现,每个版本一个。

【问题讨论】:

  • 嗯,这肯定是使用的json实现的问题。如果您自己动手,答案很容易,但这可能很疯狂。那么您使用哪个 JSON 库?你能/愿意改变吗?许多库提供将字符串反序列化为字典。然后你可以检查字典,查看version并选择相应的DTO类,然后可以从字典中水合。
  • @mnemosyn 我使用了 Newtonsoft 库。我无法更改传入的 json。我在解析之前知道 json 的版本(它在文件的名称中)。
  • 如果你事先知道版本,有什么问题?只需序列化为正确的 DTO 类。拥有两个类比在(反)序列化期间干预神秘的逻辑更容易。保持序列化简单,稍后再做翻译,这是低耦合的。

标签: c# json oop design-patterns deserialization


【解决方案1】:

我认为不需要接口来解决这个问题。

如果您想将两个版本的 JSON 反序列化为相同的类型,您可以向 PersonEntity 添加一个可为空的年龄属性,如下所示:

[JsonObject("Class")]
public class PeopleEntity {
    public string name { get; set; }
    public int? age { get; set; }
}

注意int 类型后面的?,这意味着该属性可以为空。使用 Json.NET,如果您将 v1 JSON 反序列化到此类中,name 将按预期填充,age 将保持为空。

另外,由于您预先知道要反序列化哪个版本的 JSON,您可以为每个版本设置不同的类型。为 v1 使用您现有的 PeopleEntity 类型并创建一个派生类,为 v2 添加一个 age 属性。

【讨论】:

    猜你喜欢
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2015-02-04
    • 2015-05-15
    • 1970-01-01
    相关资源
    最近更新 更多