如何将JSON(snake_case)反序列化为动态(PascalCase)?

时间:2017-10-11 05:57:56

标签: c# json json.net .net-core deserialization

此代码可以正常工作:

string json = @"{""MyProperty"" : ""bar""}";

var payload = JsonConvert.DeserializeObject<dynamic>(json);

string typedProperty = payload.MyProperty; //contains "bar"

让我们尝试使用snake_case JSON做同样的事情。我们添加SnakeCaseNamingStrategy实际上是recommended way来处理snake_case。

_snakeSettings = new JsonSerializerSettings()
{
    ContractResolver = new UnderscorePropertyNamesContractResolver()
};

public class UnderscorePropertyNamesContractResolver : DefaultContractResolver
{
    public UnderscorePropertyNamesContractResolver()
    {
        NamingStrategy = new SnakeCaseNamingStrategy();
    }
}           

然后,将设置应用于DeserializeObject来电。在反序列化为静态类型的情况下,这些设置已成功应用于snake_case JSON:

string snakeJson = @"{""my_property"" : ""bar""}";

var payload = JsonConvert.DeserializeObject<Payload>(snakeJson, _snakeSettings);

string typedProperty = payload.MyProperty; //contains "bar"

好的,将目标类型切换为dynamic

var payload = JsonConvert.DeserializeObject<dynamic>(snakeJson, _snakeSettings);

string typedProperty = payload.MyProperty; //is null
string wrongProperty = payload.my_property; //is not null

如您所见,这次忽略了_snakeSettings。我猜这是一个错误。是否存在执行JSON (snake_case) -> dynamic (PascalCase)反序列化的任何解决方法?

环境:

<TargetFramework>netcoreapp1.1</TargetFramework>
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />

1 个答案:

答案 0 :(得分:3)

当您致电JsonConvert.DeserializeObject<dynamic>时,其行为与JsonConvert.DeserializeObject<JObject>相同。 JObject不是反序列化的真正结果,而是数据的某些中间状态,它更接近读者而非对象。例如。它允许您仅反序列化JSON的一部分 因此,似乎JsonConvert.DeserializeObject<dynamic>不是创建结果对象,而是创建JSON数据的函数读取器。我想,这就是为什么它会显示没有任何后期处理的数据

我认为最好将这个问题转发给“Newtonsoft.Json”开发人员。