【问题标题】:Custom mapping with Json.NET使用 Json.NET 进行自定义映射
【发布时间】:2012-08-07 10:53:28
【问题描述】:

我正在尝试映射看起来像的 JSON

"ids": {
    "id": {
        "@value":"6763754764235874140"
    }
}

我想将它映射到几个看起来像的类

class Property
{
    public Ids Ids { get; set; }
}

class Ids
{
    public string Id { get; set; }
}

所以基本上我想将 JSON 文档中的 ids/id/@value 的值填充到类架构中的 Ids.Id 中。通过浏览文档,我想我可以使用类似的东西

[JsonProperty(ItemConverterType=typeof(IdConverter))]
public string Id { get; set; }

并提供一个名为IdConverter 的自定义JsonConverter 子类。但是,当我这样做时,我的IdConverter.ReadJson 永远不会被调用。我做错了什么?

【问题讨论】:

  • 您的资源名称是 Id,但 json 格式为 id。可能是case 问题
  • 事实证明 Json.NET 足够聪明,可以将 ids 反序列化为 Ids 属性,尽管它会在序列化时尊重大小写,除非你告诉它不要这样做。

标签: c# json serialization json.net


【解决方案1】:

看起来答案是ItemConverterType 用于转换数组中的项目。使用 JsonPropertyJsonConverter 属性对属性进行双重注释有效:

[JsonProperty(PropertyName="id")]
[JsonConverter(typeof(IdConverter))]
public string Id { get; set; }

【讨论】:

  • 来晚了。但我有同样的问题,使用JsonProperty。我将其更改为 JsonConverter 并且它正在工作,不需要额外的 JsonProperty 属性。可能只是旧版本中的错误,但在最新版本(特别是 v4)上,您可以使用 JsonConverter
  • 自从我搞砸了这件事已经有一段时间了,但我相信JsonProperty 属性是必要的,以便将Id(大写首字母)序列化为名为@9​​87654331@(小写)。如果没有额外的属性,较新的版本是否可以正确处理这个问题?
  • 看起来确实如此,是的。我认为这可能更像是默认序列化程序设置中的一个配置项,但是在较新版本中改变了它。 JsonConvert.SerializeObject(new MyClass()) 开箱即用似乎按原样使用可序列化的类属性名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多