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

Posted

技术标签:

【中文标题】如何将 JSON (snake_case) 反序列化为动态 (PascalCase)?【英文标题】:How to deserialize JSON (snake_case) to dynamic (PascalCase)? 【发布时间】:2018-03-22 16:36:09 【问题描述】:

这段代码运行良好:

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) -&gt; dynamic (PascalCase) 反序列化?

环境:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

谢谢。这是不清楚 API 的一个很好的例子。我会报告这个问题,我从 SO 开始的原因是官方 repo 中的活动非常低。 @IlyaChumakov 这不是您问题的真正答案。我也需要这样做。你能链接到你在官方仓库中创建的问题吗?

以上是关于如何将 JSON (snake_case) 反序列化为动态 (PascalCase)?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JSON-B 将 JSON 字符串反序列化为非公共类?

如何将具有嵌套属性的 JSON 对象反序列化为 Symfony 实体?

如何将对象的json数组反序列化为字典[重复]

如何使用 Jackson 将原始 JSON 反序列化为 Java 对象

如何将 JSON 反序列化为正确类型的对象,而无需事先定义类型?

如何将java对象序列化/反序列化为javax.JSON