2017-01-11 5 views
0
[{ 
     "$type": "foo", 
     "key" : "value" 
}] 

私はフレームワークの一部としてこのメ​​ッセージをシリアライズしません。 配列は不要です。私は最初の型と値などに興味があります。これは不変です。不要な配列を最初のアイテムとして持つDeserialise JSON

CAN次のコードを使用して行いますが、少し厄介です。私は特に愚かであることを知っています。私はSerializationBinderを作成する道を歩み始めましたが、その後私は自分の人生に乗りたいと考えました。それは難しいことではありません!

   var json = reader.ReadToEnd().TrimStart('[').TrimEnd(']'); 
       var foo = JsonConvert.DeserializeObject<Foo>(json , new JsonSerializerSettings() 
       { 
        TypeNameHandling = TypeNameHandling.All 
       }); 
+2

JSon文字列はfooの配列です。配列に逆シリアル化して最初の要素を取るのはなぜでしょうか。 'JsonConvert.DeserializeObject (json)[0]' – Nico

+0

また、私はJsonReaderルートも下りました。このアプローチでは、Readを追加呼び出しすると最初のトークンを越えてしまいますが、TypeNameHandlingはつまらないです。 – brumScouse

+0

@Nico - ハハ。ありがとう。それはイギリスで2.30amです:)(編集**)私は言ったように、私はばかです。 – brumScouse

答えて

2

以下のような辞書のリストにこれをデシリアライズすることができます。したがって、最良の解決策はJSONを配列として解析し、最初の要素を取得することです。基本的な例があります。

var foo = JsonConvert.DeserializeObject<Foo[]>(json)[0] 

これを処理するより安全な方法としては、最初に配列を取得し、結果が有効かどうかを確認することです。

Foo foo = fooArray.Length > 0 ? fooArray[0] : null; 

一般的な解決策として、一般的な方法として行うことができます。この方法であなたは、単にこれが第二の溶液と同じことが、一般的なクラスのために再利用することができ

Foo foo = DeserializeObjectFromArray<Foo>(json); 

を呼び出すことができます

static T DeserializeObjectFromArray<T>(string json) 
    where T: class 
{ 
    var arr = JsonConvert.DeserializeObject<T[]>(json); 
    return arr != null && arr.Length > 0 ? arr[0] : null; 
} 

乾杯。

+0

私はこのコメントを削除しましたが、TypeNameHandlingを適切に設定してJsonSerializationSettingsを指定しない限り、$ typeは受け入れられないと言っていました。私はBarがFooに取り組んでいた場所で、たくさんの物件を分かち合っていました。 Dserializeに型を渡すと、これがデフォルトの動作になっていればいいでしょう。 – brumScouse

0

コメントに基づい例でJSON文字列が有効なJSONアレイであるとして、あなたは

List<Dictionary<string, string>> values = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(a); 
+0

辞書のリストを返すことはありませんか?それは実際のJsonに近いものでもありません。タイプは言及されていません。 – Nico

+0

はいこれは辞書のリストを返します。彼は最初の項目が欲しい。 – Seminda

+0

は実際には2つの値を返し、 '$ type、foo'は配列の最初の要素になります。だから、第二の価値観を言うことができます。しかし、型がJSON文字列に含まれていない場合はどうなりますか?今は言及していないが、彼はそれをより大きな頭痛にするリストと辞書を持っている。型付き配列として解析するのがベストです。 – Nico

関連する問題