2016-06-18 18 views
3

Newtonsoft.Json.JsonSerializationExceptionをスロー:デシリアライズJSONオブジェクトは、私は、このJSONオブジェクトを持っている

{ 
   "Sheet1": [ 
      { 
         "one": 1, 
         "two": 18 
      }, 
      { 
         "one": 16, 
         "two": 33 
      }, 
      { 
         "one": 17, 
         "two": 34 
      } 
   ] 
} 

そして、私は次のモデル使用して、それをデシリアライズしようとしています:

public class Sheets 
{ 
    [JsonProperty("Sheet1")] 
    public Sheet Sheet { get; set; } 
} 

public class Sheet 
{ 
    public List<Row> Rows { get; set; } 
} 

public class Row 
{ 
    [JsonProperty("one")] 
    public string Col1 { get; set; } 

    [JsonProperty("two")] 
    public string Col2 { get; set; } 
} 

var res = JsonConvert.DeserializeObject<Sheets>(result); 

を私は取得しています

Newtonsoft.Json.dllで 'Newtonsoft.Json.JsonSerializationException'型の未処理の例外が発生しました

追加情報:現在のJSON配列を逆シリアル化できません。 [1,2,3])をタイプ 'ExcelConsoleApp.Sheet'に変換するには、そのタイプでJSONオブジェクト(例:{"name": "value"})が正しくデシリアライズされている必要があります。

私は間違っていますか?何かご意見は?

EDIT

一つの可能​​な解決策は、

dynamic dynamicObject = JsonConvert.DeserializeObject(result); 

を使用することですが、私は私のモデルに直接それをデシリアライズします。

答えて

1

Sheet1は、シートタイプが、行の一覧ではありません。これは括弧で識別することができます。
、すなわち"Sheet1": [コレクションの明確な記号であり、{で識別されるオブジェクトではありません。次へ

変更シート

public class Sheets 
{ 
    [JsonProperty("Sheet1")] 
    public List<Row> Sheet { get; set; } 
} 
+0

ah nice catch。ありがとう:) – Yar

+0

いいえ問題は、私はプロパティ 'リストシート'をより正確に、 'リスト行' –

0

エラーが表示されたので、Sheetクラスの代わりにリストを使用する必要があります。これを試してみてください :

 {"Sheets" : 
     { 
     "Sheet1": [ 
      { 
      "one": 1, 
      "two": 18 
      }, 
      { 
      "one": 16, 
      "two": 33 
      }, 
      { 
      "one": 17, 
      "two": 34 
      } 
     ] 
    } 
    } 
+0

まあのおかげで、あなたのJSONを変更するが、それは私が – Yar

+0

を持っているものあなたも、この声明の中で、あなたのクラスを変更することができることを別のJSONオブジェクトです: 'VARのRES = JsonConvert.DeserializeObject (結果);'実際に問題があるのは –

+0

です。'Sheet'は内部オブジェクトのようなものなので、そのコードを使ってヌル結果を返します。 – Yar

2

これは、私はそれをテストし、それはあなたが望むとおりに働いていた、あなたが必要とするモデルです。 JSON構造を変更する必要はありません。

public class SheetRoot 
{ 
    [JsonProperty("Sheet1")] 
    public List<Row> Sheet { get; set; } 
} 

public class Row 
{ 
    [JsonProperty("one")] 
    public int Col1 { get; set; } 

    [JsonProperty("two")] 
    public int Col2 { get; set; } 
} 

var res = JsonConvert.DeserializeObject<SheetRoot>(s); 
+0

のようなものに変更することをお勧めします回答はハカム、それは私によく見えますが、私はそうではありませんどうして私が 'Newtonsoft.Json.JsonReaderException '型の未処理の例外がNewtonsoft.Json.dllで発生したのか確かめてください。 – Yar

+0

@HoomanYarクラスとプロパティのより良い名前を作るための答えを更新しました。私は古いコードがあなたのマシン上でその例外を作り出している理由を理解できませんでした。例外なく、私の上で正しく動作していて、結果は正しいものでした。 –

+0

クラスの名前を付けたほうが良いです。私の答えは受け入れられた答えと非常に似ていますが、私はちょうどこのことを意図していません。 –

0

あなたの構造は互換性がありません。

JSONから推測すると、サンプルオブジェクトはSheet1[i].oneまたはSheet1[i].twoのようにトラバースできます。 iがインデックスです。一方、あなたが投稿したC#モデルはSheetsObj.Sheet.Row[i].Col1としてトラバースされます。

JSONまたはモデルを変更してみることができます。 だから、多分

{ 
    "Sheet1" : { 
     "Rows": [ 
      { 
      "one": 1, 
      "two": 18 
      }, 
      { 
      "one": 16, 
      "two": 33 
      }, 
      { 
      "one": 17, 
      "two": 34 
      } 
     ] 
    } 
} 
+0

Jsonの構造を変更することはできませんが、感謝します:) – Yar

+1

Hakam Fostokの答えは、 。 –

関連する問題