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

Ily*_*kov 6 c# json json.net deserialization .net-core

这段代码工作正常:

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

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

string typedProperty = payload.MyProperty; //contains "bar"
Run Code Online (Sandbox Code Playgroud)

让我们尝试对 Snake_case JSON 执行相同的操作。我们添加了一个SnakeCaseNamingStrategy实际上是处理snake_case的推荐方法。

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

public class UnderscorePropertyNamesContractResolver : DefaultContractResolver
{
    public UnderscorePropertyNamesContractResolver()
    {
        NamingStrategy = new SnakeCaseNamingStrategy();
    }
}           
Run Code Online (Sandbox Code Playgroud)

然后,将设置应用到DeserializeObject呼叫。如果反序列化为静态类型,这些设置将成功应用于 Snake_case JSON:

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

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

string typedProperty = payload.MyProperty; //contains "bar"
Run Code Online (Sandbox Code Playgroud)

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

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

string typedProperty = payload.MyProperty; //is null
string wrongProperty = payload.my_property; //is not null
Run Code Online (Sandbox Code Playgroud)

如您所见,_snakeSettings这次被忽略了。我想这是一个错误。是否有任何解决方法可以进行JSON (snake_case) -> dynamic (PascalCase)反序列化?

环境:

<TargetFramework>netcoreapp1.1</TargetFramework>
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
Run Code Online (Sandbox Code Playgroud)

ASp*_*rin 5

当你调用它时JsonConvert.DeserializeObject<dynamic>,它的行为与 相同JsonConvert.DeserializeObject<JObject>JObject不是反序列化的真实结果,而是数据的一些中间状态,它比对象更接近读者。例如,它允许您仅反序列化 JSON 的一部分 ,因此看起来不是创建结果对象,而是创建 JSON 数据的功能性读取器。我想,这就是为什么它会向您显示数据,因为它没有任何后期处理
JsonConvert.DeserializeObject<dynamic>

我认为最好将该问题直接交给“Newtonsoft.Json”开发人员。