2016-11-16 6 views
0

次のJSONデータ、クラス、コードがありますが、機能しません。私は3オブジェクトのリストを取得していますが、すべてNULLです。誰も私がここで紛失しているものを私に提案できますか?asp.netでJSONデータをデシリアライズする方法は?

JSONデータ:

[ 
    { 
     "donotpostalmail": { 
      "Do Not Allow": { 
       "Do Not Allow": 1 
      }, 
      "Allow": { 
       "Allow": 0 
      } 
     } 
    }, 
    { 
     "familystatuscode": { 
      "Single": { 
       "Single": 1 
      }, 
      "Married": { 
       "Married": 2 
      }, 
      "Divorced": { 
       "Divorced": 3 
      }, 
      "Widowed": { 
       "Widowed": 4 
      } 
     } 
    }, 
    { 
     "preferredcontactmethodcode": { 
      "Any": { 
       "Any": 1 
      }, 
      "Email": { 
       "Email": 2 
      }, 
      "Phone": { 
       "Phone": 3 
      }, 
      "Fax": { 
       "Fax": 4 
      }, 
      "Mail": { 
       "Mail": 5 
      } 
     } 
    } 
] 

クラス:

public class ResponseDataOfOptions 
{ 
    public OptionsList mainList { get; set; } 
} 
public class OptionsList 
{ 
    public Dictionary<string, Options> optionList { get; set; } 
} 
public class Options 
{ 
    public Dictionary<string, int> options { get; set; } 
} 

は.csファイルコード:

List<ResponseDataOfOptions> optionList = JsonConvert.DeserializeObject<List<ResponseDataOfOptions>>(objResponse.ResponseDataOfOptions); 
+0

私はあなたの問題が応答をマッピングしていると考えています辞書に。 http://json2csharp.comのようなものを使ってクラスを構築しようとしましたか?確かに私は前にJson - > dictで作業していませんが、それが問題になるはずです。 –

+0

私は試しました。 JSONの上に本当に貧弱なクラスが用意されています。だから、私は自分自身で試した。 JSONがDictionaryに基づいている場合、通常、json2csharp.comはより良いソリューションを提供しません。 –

+3

あなたのオブジェクトモデルはJSONデータを表すものではありません。デシリアライザがどのような値をどこに置くべきかをどのように知っていると思いますか? – Jamiec

答えて

2

すべてのオブジェクトのプロパティ名が異なるため、オブジェクトを使用することはできません。このJSONを逆シリアル化する唯一の方法は次のとおりです。

JsonConvert.DeserializeObject<List< 
     Dictionary<string, 
      Dictionary<string, 
       Dictionary<string, int> 
      > 
     > 
>>(objResponse.ResponseDataOfOptions); 

これは辞書のリストであり、実際には3つのレベルの辞書があります。データを操作するのはとてもフレンドリーな構造ではありませんが、逆シリアル化を行うことになります。

JObjectJTokenを使用してプロパティの検出を行い、適切なデータ転送オブジェクトを展開することもできます。

JObject list = JObject.Parse(objResponse.ResponseDataOfOptions); 
foreach (var item in list) { 
    JToken token = jobj["donotpostalmail"]; 
    if (token != null) { 
     // inflate the corresponding data type. 
    } 
} 
+0

私はあなたがここに代わったのと同じように別のクラスで辞書を作成しました。私はこれを既に試みたと思う。もう一度試してみましょう。 –

+1

異なるプロパティ名のためにデータ転送オブジェクトを使用することはできません。しかし、JSONを解析するためのほんの丁寧な方法はありませんが、私はそれを答えに追加しました。 – jorgonor

+0

私は最初の方法を使用しました。それは正常に動作しています。クラス構造が可能であれば大きな助けになるでしょう。さて、これはgreateソリューションです。ありがとうございました。 –

0

正しいかどうか、あなたのJSON文字列objResponse.ResponseDataOfOptions形式を確認してください、おそらくいくつかがあります文字列に&quot;が含まれている場合は、これらを置き換える必要があります。以下のようにを入力してください:

+0

問題は、 'optionList'がnullになるのではなく、辞書へのJSON文字列です。 –

1

3種類のオブジェクトタイプを含む配列は使用できません。あなたはこれをしたい場合は は、私は、配列の代わりにコンテナオブジェクトを使用することをお勧めします。

{ 
    "responseDataOfOptions": { 
     "donotpostalmail": { 
      "Do Not Allow": { 
       "Do Not Allow": 1 
      }, 
      "Allow": { 
       "Allow": 0 
      } 
     } 
    }, 
    "optionsList": { 
     "familystatuscode": { 
      "Single": { 
       "Single": 1 
      }, 
      "Married": { 
       "Married": 2 
      }, 
      "Divorced": { 
       "Divorced": 3 
      }, 
      "Widowed": { 
       "Widowed": 4 
      } 
     } 
    }, 
    "options": { 
     "preferredcontactmethodcode": { 
      "Any": { 
       "Any": 1 
      }, 
      "Email": { 
       "Email": 2 
      }, 
      "Phone": { 
       "Phone": 3 
      }, 
      "Fax": { 
       "Fax": 4 
      }, 
      "Mail": { 
       "Mail": 5 
      } 
     } 
    } 
} 

対応するC#クラスは次のようになります。

public class JsonResponse { 
    public ResponseDataOfOptions responseDataOfOptions{ get; set; } 
    public OptionsList optionsList{ get; set; } 
    public Options options { get; set; } 
} 
+0

ありがとうございます。解決策がない場合は、方法の1つです。しかし、私は解決策を得た。 –

関連する問題