如何使用JsonExtensionData来反序列化对象,如何使用JsonProperty来序列化对象

时间:2019-08-21 02:13:07

标签: c# json.net

我有一个名为BuildRaw的类,它有一个数据源,其中包含json数据,其模式不确定,例如

{
  "event_type": "123",
  "a": "a",
  "b": "b"
}

{
  "event_type": "123",
  "c": "c",
  "d": "d"
}

我想在反序列化时将不匹配的类成员映射到指定的集合(如下所示的“ CustomDimensions”),并在序列化时将此集合中的值写入特定的JsonProperty(如下所示的“ customDimensions”)中。它的输出预计会像

{
  "event_type": "123",
  "customDimensions":{
    "a": "a",
    "b": "b"
  }
}, and 
{
  "event_type": "123",
  "customDimensions":{
    "c": "c",
    "d": "d"
  }
}

我尝试将这些属性像下面一样放置(是否支持放置两个属性?),

[JsonProperty("customDimensions")]
[JsonExtensionData]

但是似乎只有JsonExtensionData起作用。它可以成功反序列化,但是在序列化时会输出:

{
  "event_type": "123",
  "a": "a",
  "b": "b"
}

,不像我预期的那样,

{
  "event_type": "123",
  "customDimensions":{
    "a": "a",
    "b": "b"
  }
}

我的班级代码:

public class BuildRaw
{
    [JsonProperty("customDimensions")]
    [JsonExtensionData]
    public IDictionary<string, object> CustomDimensions { get; set; }

    [JsonProperty("event_type")]
    public string EventType { get; set; }
}

1 个答案:

答案 0 :(得分:0)

似乎您可能需要具有两个属性-一个用于接收扩展数据,另一个用于导出所需的CustomDimensions对象:

private IDictionary<string, object> _customDimensions;

[JsonExtensionData(WriteData = false)]
public IDictionary<string, object> ExtensionData
{
    get { return _customDimensions; }
    set { _customDimensions = value; }
}

[JsonProperty("customDimensions")]
public IDictionary<string, object> CustomDimensions
{
    get { return _customDimensions; }
    set { _customDimensions = value; }
}

那我们在这里拥有什么

  • 这两个属性的通用后备字段。
  • 我们正在将WriteData = false粘贴到JsonExtensionDataAttribute,因此这应该仅用于读取而不是写入额外的值。
  • 一个属性,我们可以通过它序列化(当然也可以反序列化)CustomDimensions属性。

Try it online

或者,您可以写一个JsonConverter,尽管我认为那会更复杂。

相关问题