2017-06-22 12 views
0

私は問題に直面しています。 サーバーから複雑なJSON応答を逆シリアル化する必要がありますが、その一部だけが必要です。ここでJSONファイルの1つのプロパティをデシリアライズ

は一例です:

{ 
"menu": { 
    "id": "file", 
    "value": "File", 
    "popup": { 
    "menuitem": [ 
     {"value": "New", "onclick": "CreateNewDoc()"}, 
     {"value": "Open", "onclick": "OpenDoc()"}, 
     {"value": "Close", "onclick": "CloseDoc()"} 
    ] 
    } 
} 
} 

はまた、私は必要なクラスオブジェクトを取得するためにCsharp2jsonを使用し、私はちょうど私のニーズに応じてメニュークラスを変更:今すぐ

public class Menuitem 
{ 
    public string value { get; set; } 
    public string onclick { get; set; } 
} 

public class Popup 
{ 
    public IList<Menuitem> menuitem { get; set; } 
} 

public class Menu 
{ 
    public Popup popup { get; set; } 
} 

public class RootObjectJourney 
{ 
    public Menu menu { get; set; } 
} 

、どのように私はポップアップの価値と彼の子供が必要な場合私は逆順化するのですか?

+0

すべての応答を表示してポップアップのみを選択してみませんか?すべての応答のdeserealisingはちょうどあなたの場合に必要なものよりわずかに高価です – Kirhgoph

+3

あなたが持っているものは、あなたが説明したことを*すべき*すべき*。デシリアライザで実行するとどうなりますか?すなわち、 'var root = JsonConvert.DeserializeObject (json); var menuitems = root.menu.popup.menuitem; '? –

+0

この場合、私はすべてをデシリアライズします。しかし、それは私の実際のJsonの単純化に過ぎません。 実際のjsonを取得するには、このURLでGetリクエストを行います。http://transport.opendata.ch/v1/connections?from=lausanne&to=fribourg これは非常に複雑で時間がかかります。 @MarcGravell「オブジェクト参照がオブジェクトのインスタンスに設定されていません」と表示されます。 –

答えて

2

難しいやり方を試したいのであれば、実際にはNewtonSoft.JsonのLinq名前空間を利用してコードを少し修正してJSONの "ポップアップ"要素だけを得ることができます。

あなたのクラス構造は変わりません。

のように、あなたはあなたと一緒にJSON文字列を持っていたら、あなたはJSONを解析するために、「解析」「JOBJECT」静的メソッドを使用することができ、あなたのコードでは、名前空間(S)、その後

using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 

を使用していることを確認します

var parsedObject = JObject.Parse(jsonString); 

これは、辞書のようにすべてのJSONキーにアクセスできるJObjectを提供します。

var popupJson = parsedObject["menu"]["popup"].ToString(); 

このpopupJsonには、ポップアップキー専用のJSONが追加されました。 これでJsonConvertを使ってJSONを逆シリアル化することができます。

var popupObj = JsonConvert.DeserializeObject<Popup>(popupJson); 

このpopupObjにはmenuitemsのリストしかありません。

希望すると便利です。

関連する問題