【发布时间】: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