8

我刚刚将我们的 Json.NET 从版本 3.5 Release 7 升级到 4.0 Release 8,并意识到序列化不是以相同的方式完成的。序列化包含标准 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")]并不是一个真正的选择)

关于如何解决这个问题的任何想法?

4

2 回答 2

2

嗯 - 发现此更改是在 4.0R1 和 4.0R2 之间完成的。这就是问题所在。

从 json 的角度来看,我可以看到它是正确的,但我不确定我是否真的同意实际的改变。至少不会在两个次要版本之间进行这样的更改。

那里也发布了解决方法。

于 2012-03-14T07:31:08.380 回答
1

嗯.. 降级到按您希望的方式工作的版本。

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

于 2012-03-13T14:33:24.343 回答