【发布时间】:2023-03-31 17:00:01
【问题描述】:
这段代码运行良好:
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) -> dynamic (PascalCase) 反序列化?
环境:
<TargetFramework>netcoreapp1.1</TargetFramework>
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
【问题讨论】:
标签: c# json json.net .net-core deserialization