此代码工作正常:如何反序列化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" />
感谢。这是不清楚API的一个很好的例子。我会报告这个问题,我从SO开始的原因在官方回购中是相当低的活动。 –