このコードは正常に動作します: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
コールに設定を適用します。 dynamic
にターゲットタイプを切り替え、
string snakeJson = @"{""my_property"" : ""bar""}";
var payload = JsonConvert.DeserializeObject<Payload>(snakeJson, _snakeSettings);
string typedProperty = payload.MyProperty; //contains "bar"
OK:静的な型へのデシリアライゼーションの場合には、それらの設定が正常にJSONをsnake_caseに適用されている
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から始めた理由は、公式レポではかなり低い活動です。 –