2017-07-19 13 views
3

これを正しく逆シリアル化する方法を頭に入れようとしています。JSONを逆シリアル化しようとしたときにNullReferenceExceptionが発生する

{ 
    "_note": "You are currently authenticated with the API using your OPSkins login session cookies.", 
    "status": 1, 
    "time": 1500460072, 
    "response": { 
    "AK-47 | Aquamarine Revenge (Battle-Scarred)": { 
     "op_7_day": 999, 
     "op_30_day": 932 
    }, 
    "AK-47 | Aquamarine Revenge (Factory New)": { 
     "op_7_day": 2738, 
     "op_30_day": 2665 
    } 
    } 
} 

ここに私のクラス構造は、これは私がそれをデシリアライズしようとしている方法です

public class OpRoot 
{ 
    public string _note { get; set; } 
    public int status { get; set; } 
    public int time { get; set; } 
    public OpResponse response { get; set; } 
} 

public class OpResponse 
{ 
    public Dictionary<string, OpItem> items { get; set; } 
} 

public class OpItem 
{ 
    public int op_7_day { get; set; } 
    public int op_30_day { get; set; } 
} 

です:

OpRoot OpInstance = JsonConvert.DeserializeObject<OpRoot>(readerResponse); 

私が代わりに一覧に辞書を変更しようとしましたが、 "items"オブジェクトを呼び出そうとしたときに同じ結果 "System.NullReferenceException"が返されました:

Console.WriteLine(OpInstance.response.items.Values); 

問題は "OpResponse"クラスのコード内にあると思います。しかし、このコードの大半は以前は別のJSON構造で動作していました。

任意の助けいただければ幸い

EDIT:固定タイプミス

+2

JSONが不正です.Jsonは常に '{' –

+0

で始まります。JSON形式が正しくありません。カッコの位置を確認してください({})。 –

+0

これは郵便のタイプミスで、今修正しました。 – multikus

答えて

2

OpResponseは不要です。次のクラスでは動作します:

public class OpRoot 
{ 
    public string _note { get; set; } 
    public int status { get; set; } 
    public int time { get; set; } 
    public Dictionary<string, OpItem> response { get; set; } 
} 

public class OpItem 
{ 
    public int op_7_day { get; set; } 
    public int op_30_day { get; set; } 
} 
+0

ありがとうございます!魅力的な作品 – multikus

0

EDIT:

私は正直に、独自の文字列名でOpItemを保存したいentirely-あなたが1つのクラスを排除することができますが、それは私だけです:

public class OpRoot 
{ 
    public string _note { get; set; } 
    public int status { get; set; } 
    public int time { get; set; } 
    public List<OpItem> {get; set;} 
} 

public class OpItem 
{ 
    public int op_7_day { get; set; } 
    public int op_30_day { get; set; } 
    public string name {get; set;} 
} 

または、あなたが得るjsonを変更できない場合は、もう一方の答えを取ることができます。

+0

これは問題を解決しない限り、私はこの質問に誤植としてフラグを立てています。 – Ares

+0

私のせい!私がここに投稿したJSONは、ずっと長いJSONから切り離されていました。私は間違いなくこの欄に2つの括弧を含めるのを忘れていました。入力ミスを修正しました。まだエラーが発生しています。 – multikus

+0

jsonに明示的に 'items'という名前が表示されていません。どうしてですか? – Ares

関連する問題