Json.Net往返失败与PascalCase

时间:2015-08-07 23:14:13

标签: c# json

以下类将往返(序列化为字符串,然后反序列化为对象)就好了:

public class FoobarObject
{
    public readonly IFileLocation File1;
    public readonly IFileLocation File2;
    public readonly IFileLocation File3;

    public FoobarObject(IFileLocation file1, IFileLocation file2, IFileLocation file3)
    {
        File1 = file1;
        File2 = file2;
        File3 = file3;
    }
}

但是,如果我将其更改为以下内容,则会失败(字段将返回为null):

public class FoobarObject
{
    //[JsonProperty("SomeFile1")]
    public readonly IFileLocation SomeFile1;
    public readonly IFileLocation File2;
    public readonly IFileLocation File3;

    public FoobarObject(IFileLocation file1, IFileLocation file2, IFileLocation file3)
    {
        SomeFile1 = file1;
        File2 = file2;
        File3 = file3;
    }
}

但是,通过取消注释JsonProperty行,该对象将正确地进行往返。

序列化字符串似乎是正确的("{\"SomeFile1\":\"C:\\\\vibwd541.u2q\\\\Foobar1\", \"File2\":\"C:\\\\vibwd541.u2q\\\\Foobar2\", \"File3\":null}",但反序列化不会发生。

发生了什么事?

1 个答案:

答案 0 :(得分:2)

发生这种情况的原因是,默认情况下,Json.NET使用ConstructorHandling.Default算法来确定反序列化类型时要使用的构造函数。根据{{​​3}}:

,此算法的工作原理如下
  

ConstructorHandling Enumeration

Default                             First attempt to use the public default constructor, then fall back to single paramatized constructor, then the non-public default constructor. 
AllowNonPublicDefaultConstructor    Json.NET will use a non-public default constructor before falling back to a paramatized constructor. 

您的班级有一个公共构造函数。它有三个参数IFileLocation file1, IFileLocation file2, IFileLocation file3。因此,Json.NET将在反序列化期间使用它构建对象docs。因此,如果在序列化期间将File1重命名为SomeFile1,它将不再与任何构造函数参数的名称匹配,也不会反序列化。

要避免此问题,请确保属性名称与构造函数参数名称匹配。