C# 使用Json.NET自定义映射

C# 使用Json.NET自定义映射,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我正在尝试映射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。通过浏

我正在尝试映射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
永远不会被调用。我做错了什么?

看起来答案是
ItemConverterType
用于转换数组中的项。使用
JsonProperty
JsonConverter
属性对属性进行双重注释可以工作:

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

您的属性名为
Id
,但在json中为
Id
。这可能是一个
case
问题原来Json.NET足够聪明,可以将
ids
反序列化到
ids
属性中,尽管它在序列化时会尊重case,除非你告诉它不要这样做。但是我也遇到了同样的问题,使用
JsonProperty
。我将其更改为
JsonConverter
,并且它正在工作,不需要额外的
JsonProperty
属性。可能只是旧版本中的一个bug,但在最新版本(特别是v4)中,您可以只使用
JsonConverter
我已经有一段时间没有处理这个问题了,但我相信
JsonProperty
属性是序列化
Id
所必需的(大写第一个字母)进入名为
id
(小写)的JSON字段。新版本在没有额外属性的情况下是否能正确处理此问题?看起来好像是这样,是的。我认为这可能更像是默认序列化程序设置中的一个配置项,而在较新版本中,它改变了这一点
JsonConvert.SerializeObject(new MyClass())
开箱即用的似乎是“原样”的可序列化类属性名称。