【问题标题】:JSON.NET unknown type deserializationJSON.NET 未知类型反序列化
【发布时间】:2013-01-07 01:05:03
【问题描述】:

假设我有以下 json 字符串,其中一些属性名称不同(“dataA”、“dataB”),但它包含相同的结构

{
  "mainprop": "val",
  "dataA": { "prop1":"val", "prop2":"val"}
}

和

{
  "mainprop": "val",
  "dataB": { "prop1":"val", "prop2":"val"}
}

如何将这些 json 反序列化为具有以下泛型类的对象

Class Generic
{
  string mainprop;
  DataClass data; 
}

Class DataClass
{
  string prop1;
  string prop2;
}

换句话说,我如何处理基于属性名称的反序列化。

【问题讨论】:

  • 欢迎来到 Stack Overflow!你试过什么?
  • 您可以使用正则表达式来预处理 json 字符串以匹配您的目标类。
  • 我想避免字符串预处理并尝试找到更优雅的解决方案
  • 一般 json.net 解析 json 字符串并能够触发 MissingMember 错误,因此如果可以选择通过获取成员名称和为我的“数据”成员返回自定义反序列化的能力来处理此问题

标签: c# .net json


【解决方案1】:

您始终可以进行通用反序列化(到 Dictionary<string, object>),然后自己映射值,但我怀疑这不是您想要的。

我能想到的唯一方法是制作两个仅用于反序列化/序列化目的的虚拟对象。

public class GenericA : Generic {
    public DataClass dataA { get { return data; } set { data = value; } }
}

public class GenericB : Generic {
    public DataClass dataB { get { return data; } set { data = value; } }
}

Generic a = JsonConvert.DeserializeObject<GenericA>("JSON using dataA");
Generic b = JsonConvert.DeserializeObject<GenericB>("JSON using dataB");

我没有测试过这段代码。

编辑

您可能希望将您的data 属性与[JsonIgnore] 关联,这样您就可以序列化GenericA 和GenericB,而无需重复使用相同的属性。

【讨论】:

  • 感谢您的回复,但您的解决方案需要生成虚拟类。在我的情况下,属性的“名称”数组太大且动态。有没有办法以编程方式处理一些丢失的成员? JSON.NET 设置有 MissingMemberHandling 属性,但我看不到如何处理它并以某种方式返回正确的类反序列化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2011-09-19
  • 2017-09-03
  • 1970-01-01
相关资源
最近更新 更多