2016-10-19 13 views
0

私はコントロールできない外部APIからいくつかのJSONを取得していますが、一部のフィールドがそのプロパティにネストされているオブジェクトにデシリアライズする必要があります。主要な目的ので、まっすぐなデシリアライズは動作しません。JSON.NETを使用してフラットなJSONオブジェクトをデシリアライズ

私は私の問題に発見した最も近い質問です:私はJSON.NETの使用にかなり新たなんだと今でもしようとして

Json .Net serialize flat object into a complex object (change objects structure on serialization/deserialization)

私は本当にかかわらず、私の問題にこれを適用することができませんでしたそれがどのように機能するかを理解する。

バックAPIからJSONを実証するための小さなサンプル:

{ 
    FirstName: "John", 
    LastName: "Smith", 
    PassportNo: "xxxxx", 
    NiNo: "xxxxx", 
} 

クラス(ES)私はにdeserialiseしたい:私は行く方法がわからなかった

internal sealed class Person 
{ 
    [JsonProperty(PropertyName = "FirstName")] 
    public string FirstName { get; set; } 

    [JsonProperty(PropertyName = "LastName")] 
    public string LastName { get; set; } 

    public PrivateData PrivateData { get; set; } 
} 

internal sealed class PrivateData 
{ 
    [JsonProperty(PropertyName = "PassportNo")] 
    public string PassportNo { get; set; } 

    [JsonProperty(PropertyName = "NiNo")] 
    public string NationalInsuranceNumber { get; set; } 
} 

必要な結果を得るためにカスタム契約リゾルバ/ JSONコンバータを実装する方法について説明します。

答えて

1

デフォルトのJsonConvertクラスはJSON.Netで、複雑なクラスのフラットjson構造を変換できないため使用できません。私があなたの中にいるなら、私はjsonをDictionary<string, string>として解析してから、あなたの人のクラスを作成します。このような
何か:私は見

Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(json); 
var person = new Person { 
       FirstName = values["FirstName"] , 
       LastName = values["LastName "], 
       PrivateData = new PrivateData { 
            PassportNo = values["PassportNo"], 
            NationalInsuranceNumber = values["NiNo"] 
               } 
       }; 
+0

は、私はこのアプローチを検討したが、ハードコードに保守のためのマッピングを持っていないし、私はそれが特にパフォーマンスではないような反射を使用する必要はありません期待していました。ありがとう、おそらくちょうどこれを行い、メンテナンスオーバーヘッドを扱うでしょう。 – Vistari

+0

また、反射しても問題が発生する可能性があります。 Personクラスでは別のクラスハンドラがあり、そのハンドラには 'NiNo'という別のプロパティがあるとしましょう。識別子(例えば 'prefix.NiNo')がない場合は、プロパティに正しい値を設定するのが最も不可能です – Tinwor

関連する問題