2017-10-11 11 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コールに設定を適用します。 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" /> 

答えて

2

あなたがJsonConvert.DeserializeObject<dynamic>を呼び出すと、それはJsonConvert.DeserializeObject<JObject>と同じように動作します。 JObjectは、逆シリアル化の実際の結果ではありませんが、データの一部の中間状態です。読者よりオブジェクトに近いです。例えば。それはJsonConvert.DeserializeObject<dynamic>のように結果オブジェクトではなく、JSONデータのための機能的なリーダーを作成するように思われるので、あなたはJSONの一部のみを逆シリアル化することができます。
私は、その理由は、後処理なしでデータを表示する理由です。

"Newtonsoft.Json"開発者に質問するほうがよいと思います。

+0

ありがとうございました。これは不明瞭なAPIの良い例です。私はこの問題を報告します。私がSOから始めた理由は、公式レポではかなり低い活動です。 –

関連する問題