2017-10-13 7 views
2

例の後に例を見てみると、私の試行はうまくいっていません。C#でJSONを逆シリアル化する際の問題

私は、このJSONリターンをデシリアライズしようとしている:ここで

{ 
    "status": "success", 
    "data": { 
    "result": "match", 
    "id_user": 26564, 
    "dob_match": null, 
    "first_name_match": null, 
    "last_name_match": null 
    }, 
    "code": 200 
} 

は私のJSONオブジェクトクラスの宣言です:私のストリーム方式で

[DataContract] 
internal class DccCoachApi 
{ 
    [DataMember] 
    public string result { get; set; } 
    public string id_user { get; set; } 
    public string dob_match { get; set; } 
    public string first_name_match { get; set; } 
    public string last_name_match { get; set; } 
} 

、私streamRead変数が充填されている。 {"status":"success","data":{"result":"match","id_user":26564,"dob_match":null,"first_name_match":null,"last_name_match":null},"code":200}

方法1はコチラIDを入力しません:

  using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(streamRead))) 
      { 
       // Deserialization from JSON 
       var deserializer = new DataContractJsonSerializer(typeof(DccCoachApi)); 
       var dccObj = (DccCoachApi)deserializer.ReadObject(ms); 
       coachId = dccObj.id_user; 
      } 

もない方法2:

  DccCoachApi coach = new JavaScriptSerializer().Deserialize<DccCoachApi>(streamRead); 

      coachId = coach.id_user; 

もないメソッド3:

  JavaScriptSerializer js = new JavaScriptSerializer(); 
      DccCoachApi dccObj = js.Deserialize<DccCoachApi>(streamRead); 
      coachId = dccObj.id_user; 

もないメソッド4:私が引くときに生成されます

  dynamic dccObject = js.Deserialize<dynamic>(streamRead); 
      coachId = dccObject["id_user"]; 

ハードエラーメソッド4から直接外した値は次のとおりです。 System.Collections.Generic.KeyNotFoundException:指定されたキーが辞書に存在しませんでした。 System.Collections.Generic.Dictionary`2.get_Item(TKeyキー)

メソッド1-3は、ハードエラーを発生させませんが、データなしでcoachIdを設定します。

誰かが私が間違っていることを教えていただけますか?

+0

あなたは最初のプロパティではなくすべてのプロパティに '[DataMember]'を追加しようとしましたか? –

+1

JSON辞書には、 'status'、' data'、 'code'という3つのキーがあります。 'DccCoachApi'クラスには何も表示されません。そのクラスは 'data'メンバーにとって適切な型であるようです。 – smarx

+2

JSONをクリップボードにコピーし、VS **編集メニューから** ** **貼り付けを選択** - ** JSONをクラスとして貼り付け** – Plutonix

答えて

2

あなたは単にここに適切なクラスを生成することができます

http://json2csharp.com/

これは、それが唯一のデシリアライズ、この単一のプロパティにシリアライザを混乱させる可能性がある、あなたはデータメンバーの属性は必要ありませんように、それがどのように見えるべきかであります

public class Data 
{ 
    public string result { get; set; } 
    public int id_user { get; set; } 
    public object dob_match { get; set; } 
    public object first_name_match { get; set; } 
    public object last_name_match { get; set; } 
} 

public class RootObject 
{ 
    public string status { get; set; } 
    public Data data { get; set; } 
    public int code { get; set; } 
} 

コード:

var deserializer = DataContractJsonSerializer(typeof(RootObject)); 
var root = (RootObject)deserializer.ReadObject(ms); 
var coachId = root.data.id_user; 
+0

ありがとう!私はコードにわずかなバリエーションを使用し、それを動作させました!非常に高く評価!! –

0

私はこのように見えるようにコードを改訂し、それは完全に私の値をダンプしています。私が解決策に達するのを手伝った皆様に感謝します。 Plutonix、ペーストのスペシャル411にも感謝しました。私はそれが存在するかどうか分かりませんでした。非常に便利!

   using (var reader = new StreamReader(webResponse.GetResponseStream())) 
      { 
       var streamRead = reader.ReadToEnd(); 
       reader.Close(); 
       using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(streamRead))) 
       { 
        JavaScriptSerializer js = new JavaScriptSerializer(); 
        DccCoachRootobject dccObj = js.Deserialize<DccCoachRootobject>(streamRead); 
        coachId = dccObj.data.id_user.ToString(); 
       } 
      } 
関連する問題