2017-10-11 20 views
0

此代码工作正常:如何反序列化JSON(snake_case)动态(PascalCase)?

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" /> 

回答

2

当你调用JsonConvert.DeserializeObject<dynamic>它的行为方式与JsonConvert.DeserializeObject<JObject>相同。 JObject不是反序列化的一个真实的结果,但数据的一些中间状态,它是比对象接近读者。例如。它可以让你反序列化一个JSON
所以好像JsonConvert.DeserializeObject<dynamic>只是一部分未创建结果对象,但一个范围,对于JSON数据功能的阅读器。我想,这就是为什么它表明你的数据,因为它是没有任何后期处理

我想这是最好直接问到“Newtonsoft.Json”开发商。

+0

感谢。这是不清楚API的一个很好的例子。我会报告这个问题,我从SO开始的原因在官方回购中是相当低的活动。 –