【问题标题】:Can I Deserialize a JSON string into an object if I only know the parameters of the objects' constructor?如果我只知道对象构造函数的参数,我可以将 JSON 字符串反序列化为对象吗?
【发布时间】:2010-11-25 07:13:37
【问题描述】:

这就像this one 的后续问题。

基本上我正在做的是将某些 UI 上的某些字段暴露给某些用户。

这些字段是根据给定对象构造函数的参数列表建立的。用户可以选择 UI 显示的对象,哦我不知道,比方说从下拉列表中选择一个对象。

填写完字段并且用户提交后,我就知道需要创建的对象类型、构造函数采用的参数名称和参数类型。我在服务器上得到一个 JSON 字符串(后面的 C# 代码)。

该对象可能具有比构造函数公开的更多的属性,无论是公共的还是私有的。

如果 JSON 字符串不包含所有属性的数据,我是否仍可以使用 JavaScript 或 JSON 反序列化来获取我的对象?

我不确定是否可以通过属性属性或其他方式指定默认值...

谢谢。

【问题讨论】:

  • 我正在尝试 DataContractJsonSerializer。我试图反序列化的对象派生自一个派生自一个类的类。我必须确保它扩展的类也具有 DataContract 属性。我现在可以得到一个对象了。
  • ...但似乎我的 JSON 格式可能不正确,这意味着我没有在客户端正确构建对象,因为属性设置不正确。

标签: c# .net json reflection serialization


【解决方案1】:

DataContract 反序列化器在填充对象时根本不使用类型的构造函数。它实际上使用字段/设置器/获取器填充对象。此外,如果您不为某些属性提供值,除非您连接 DataContract 事件,例如 OnDeserializing、OnDeserialize 等,否则它们将初始化为默认值。例如,如果该类型有一个名为 FirstName 的字符串类型的属性 (显然)并且 json 没有为 FirstName 定义任何内容,当您反序列化时,您将获得 null 作为默认值,因为您没有提供此字段。

【讨论】:

    【解决方案2】:

    Json.NET 支持通过参数化构造函数创建类型,前提是只有一个构造函数,并且参数名称与 JSON 对象上的属性名称匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      相关资源
      最近更新 更多