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



这段代码工作正常:

string json = @"{""MyProperty"" : ""bar""}";
var payload = JsonConvert.DeserializeObject<dynamic>(json);
string typedProperty = payload.MyProperty; //contains "bar"

让我们尝试对snake_case JSON 执行相同的操作。我们添加了一个SnakeCaseNamingStrategy,这实际上是处理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" />

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

我想最好把

这个问题直接交给"Newtonsoft.Json"开发人员。

相关内容

  • 没有找到相关文章

最新更新