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

标签 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"

OK,切换目标类型为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”开发人员。

关于c# - 如何将 JSON (snake_case) 反序列化为动态 (PascalCase)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46680816/

相关文章:

mysql json将字符串替换为整数

c# - 无法加载文件或程序集 'Newtonsoft.Json' Version=11.0.0.0

C# 将 XML 解析为不同的列表

c# - 覆盖长文本字符串的流利 NHibernate nvarchar(MAX) 而不是 nvarchar(255)

c# - 状态很重要的对象的最佳设计模式 - 单例或静态

java - 可能是二进制但通常是文本的数据的高效 JSON 编码

c# - 什么是适合 .net 的 RDF 库?

c++ - 如何以惯用的方式实现 C++ 序列化程序?

c# - 将 JSON 字符串数组转换为 C# 列表对象,为列表中模型的每个字段返回 "null"值

json - 使用 System.Text.Json 序列化 Record 成员