【问题标题】:Partial deserialization with Json.net使用 Json.net 进行部分反序列化
【发布时间】:2017-08-22 02:05:26
【问题描述】:

Json.net 是否有一种现有方法可以使用具体类型作为模板将 json 字符串反序列化为匿名对象(仅具有 json 属性)?

示例

JSON:

{ X: 1, Z: 2 }

型号:

public class Point {
    public float X { get; set; }
    public float Y { get; set; }
    public float Z { get; set; }
}

所需的反序列化输出匿名对象:

new { X=1.0f, Z=1.0f } //Please note that X & Z are typed according to the Point class.

我想做类似的事情:

var @object = serializer.DeserializeAsAnonymous<Point>(json);

为什么?我想检测模型的哪些属性要使用两边的反射来更新(模型和提供的反序列化 json)。

【问题讨论】:

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


    【解决方案1】:
    var point = new { X = 0.0f, Z = 0.0f };
    var jsonResponse = 
        JsonConvert.DeserializeAnonymousType(json, point);
    

    【讨论】:

    • 感谢旅游回答,但这不是我要找的。我想使用现有类型作为模板并将 json 提供的属性反序列化为匿名对象。 请不要投票。
    • @fso 答案完全符合您的要求。您能否澄清一下这不能回答您的问题,我们可以看看我们是否可以解决这个问题。
    • 答案完全符合您的要求 --> NO 1) 我不想在反序列化之前实例化匿名类型。 2) 用于反序列化的 template 类型应该是 static 并且应该用作 mask 和属性类型验证。
    • @fso 只需要实例化匿名类型就可以作为模板使用;匿名类型没有类,因此需要将其用作类型。没有其他方法可以做到这一点。
    【解决方案2】:

    ,除非您使用代码生成,否则无法做到这一点。匿名类型是在编译时定义的,而您是说在获得 JSON 之前(在运行时)您不知道匿名类型中需要哪些属性。

    如果您只是想检测 JSON 中是否存在哪些属性,您可以反序列化为 JObject,然后对其进行处理以找出发生了什么变化。或者,您可以向模型添加状态字典,然后使用 JsonConverter 反序列化到它。有关这些想法的示例,请参阅 Is there a way in Json.NET serialization to distinguish between "null because not present" and "null because null"?

    【讨论】:

    • 谢谢,我只是想知道我是否需要编写自己的转换器,有或没有一些表达式魔法,这不是 Json.net 库的一部分,所以我将自己实现它。 PS:链接为ty。
    【解决方案3】:

    serializer.Populate 是我一直在寻找的方法... 它不会生成匿名对象,但会使用现有 json 属性填充现有对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多