CamelCase打破了Json.NET版本4的变化

时间:2012-03-13 13:01:54

标签: c# .net json json.net camelcasing

我刚刚将我们的Json.NET从版本3.5发行版7升级到4.0版本8,并意识到没有以相同的方式完成seralization。序列化包含标准Dictionary的对象时,3.5版本保持字典键不变,但使用4.0时,合同解析器也适用于键。

例如,使用以下JsonSerializerSettings时:

jsonSerializerSettings = new JsonSerializerSettings
{
    Converters = new List<JsonConverter> { new JavaScriptDateTimeConverter() },
    NullValueHandling = NullValueHandling.Ignore,
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};

当序列化像这样的对象时:

[JsonObject(MemberSerialization.OptOut)]
public class ProductFilter
{
    public int Id { get; set; }
    public int NodeId { get; set; }
    public IDictionary<string, ProductFilterAttribute> Attributes { get; set; }
}

Attributes字典中的键也变为camelCase。在版本3.5R7中,那些保持不变,我认为这是正确的方法。

3.5R7输出的示例片段:

{
    "id": 98659,
    "nodeId": 317970,
    "attributes": {
        "FULL_TIME_USE": {
            values: [ { "1" } ],
            formattedValue: "...

4.0R8输出的示例片段:

{
    "id": 98659,
    "nodeId": 317970,
    "attributes": {
        "fULL_TIME_USE": {
            values: [ { "1" } ],
            formattedValue: "...

(我们有很多类似的代码,因此删除camelCase解析并添加[JsonProperty("id")][JsonProperty("nodeId")]等并不是真正的选项。

有关如何解决此问题的任何想法?

2 个答案:

答案 0 :(得分:2)

嗯 - 发现这种变化是在4.0R1和4.0R2之间完成的。 Here's the issue.

我可以从json的角度看出这是正确的,但我不确定我是否真的同意实际的改变。至少在两个次要版本之间没有做出这样的改变。

此处也会发布一种解决方法。

答案 1 :(得分:1)

嗯..降级到一个按照你想要的方式运行的版本。

然后使用Json.NET提交错误报告。