2012-01-05 6 views
17

一部のJSONデータをアプリケーションのオブジェクトに逆シリアル化しようとしています。これまでは、JSONデータのプロパティが静的(値を持つキー)だったので、問題なく終了しました。今、キーが動的なデータであるという結果が得られました。動的データを含むJSon.NETを使用してJSONを逆シリアル化する

http://en.wikipedia.org/w/api.php?action=query&format=json&pageids=6695&prop=info

結果のJSONこのためである:ここで

は、例えば、JSONのURLです

{ "query" : { "pages" : { "6695" : { "counter" : "", 
      "lastrevid" : 468683764, 
      "length" : 8899, 
      "ns" : 0, 
      "pageid" : 6695, 
      "title" : "Citadel", 
      "touched" : "2012-01-03T19:16:16Z" 
     } } } } 

オーケー、私はに "ページ" のデータをデシリアライズすることはできませんを除いて、それは素晴らしいことですオブジェクト。私はそれがこのように見えるしなければならないページのクラスを定義した場合:内容をdeserialzeするために

public class 6695 
{ 
    public string counter { get; set; } 
    public int lastrevid { get; set; } 
    public int length { get; set; } 
    public int ns { get; set; } 
    public int pageid { get; set; } 
    public string title { get; set; } 
    public string touched { get; set; } 
} 

を(JsonConvert.Deserialize(jsondata)を使用して)、我々はすべて私たちが持っていないことを知ってそれだけでなく、クラスの名前も異なる必要があります(たとえば、pageid = 7145は7145クラスでなければなりません)。

JObject.Parse(コンテンツ)のようなものを使用し、次にJArraysとしてアイテムにアクセスすると、いくつかの値が抜け落ちているように見えますが、かなり醜いですし、ページ配列からデータを取得しようとしています。

これを手伝う人を探しています。私はそれが珍しいとは思わない、それは私が前に出会って、それを処理する方法がわからないJSONデータではない。

ありがとうございます!

PSは、Windows Phone 7に搭載されているので、「ダイナミック」は利用できません。

+0

6695、ちょうどないだろうかクラス名ではなくプロパティ名?それでも問題はありますが、数値プロパティの検索と置換を固定名にすることができます。私はJson.NETがこれをどのように処理するのか分かりませんが、特定のオブジェクト型の辞書として逆シリアル化を試みることはできますか? –

+0

私はおそらくこのパーティーに少し遅れますが、newtonsoftのlibにはJObjectがあります。var obj = JObject.Parse(jsonString);基本的には、JavaScriptがブラウザでどのように動作するかと同様に、複雑なネストされた辞書のようなデータを扱います。 var page = obj ["pages"] ["6695"] – War

答えて

18

https://github.com/facebook-csharp-sdk/simple-jsonhttps://nuget.org/packages/SimpleJson)の使用方法は次のとおりです。

var text = "{\"query\":{\"pages\":{\"6695\":{\"pageid\":6695,\"ns\":0,\"title\":\"Citadel\",\"touched\":\"2012-01-03T19:16:16Z\",\"lastrevid\":468683764,\"counter\":\"\",\"length\":8899}}}}"; 

(ダイナミック使用)

dynamic json = SimpleJson.DeserializeObject(text); 
string title = json.query.pages["6695"].title; 

foreach (KeyValuePair<string, dynamic> page in json.query.pages) 
{ 
    var id = page.Key; 
    var pageId = page.Value.pageid; 
    var ns = page.Value.ns; 
} 

(強く型付けされたクラスを使用)

class result 
{ 
    public query query { get; set; } 
} 
class query 
{ 
    public IDictionary<string, page> pages { get; set; } 
} 
class page 
{ 
    public long pageid { get; set; } 
    public string title { get; set; } 
} 

var result = SimpleJson.DeserializeObject<result>(text); 

サポートしていませんダイナミック[更新]

のWindows Phone上厳密に型指定されたクラスを使いたくない。

var json = (IDictionary<string, object>)SimpleJson.DeserializeObject(text); 
var query = (IDictionary<string, object>)json["query"]; 
var pages = (IDictionary<string, object>)query["pages"]; 
var pageKeys = pages.Keys; 
var page = (IDictionary<string, object>)pages["6695"]; 
var title = (string)page["title"]; 
+0

素晴らしいです!これは動作します(Json.NETは同じで、強く型付けされたクラスを使うことができます。 – Bil

+0

GitHubからGistファイルの詳細を解析しようとすると、この問題が発生しました。ここで答えをありがとうございます。IDictionaryを使用するとは思わなかったです! –

28

最も簡単な方法です。この特殊なケースでは、おそらくdynamicになるでしょう。あなたがdata["query"]["pages"]["6695"]["lastrevid"]ような何かを行うことができますので

dynamic data = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json); 
var lastRevId = data.query.pages["6695"].lastrevid; 

あなたはそれによって任意の要素を参照することができますが[]名前です。これは、その名前がc#で有効でない小さなオブジェクトのすべてによって取得されます。

+2

これは動的にサポートされていないwp7のようです:(私は配列の構文を使用してすべてにアクセスできる "JObject"のインスタンスを取得します。 – Buildstarted

+0

あなたは**一般的な**メソッドを使う必要はありません。単に 'dynamic data = JsonConvert.DeserializeObject(json);'のようにすることができます。 –

0

JSON文字列の単純な検索と置き換えはどうですか?最も洗練されたソリューションではないかもしれませんが、おそらく最も実用的なソリューションになるでしょう。

+0

ええ、誰かがTwitterでそれを思いついたばかりです。それを打つと、おそらくうまくいくでしょう。 – Bil

0

たぶん、あなただけのオブジェクト型を含むように1つの予約済みの属性を使用して、この記事のように基本型を使用することができます。Dynamic types with JSON.NET

1

Json.netを使用して、あなただけ行うことができます。

Dictionary<string,object> result = JsonConvert.DeserializeObject<Dictionary<string,object>>(json); 
foreach(var item in result) 
    Console.WriteLine(item.Key + " " + item.Value); 
1

以下の例が役立つことを願っています。 私はいつもjsonに合ったモデルを設計します。それはあなた自身のモデル設計であるときにオブジェクトで作業する方がはるかに良いです。

jsonからc#モデルを生成するのは非常に簡単です。私は、モデルを生成するには、このウェブサイトを使用します。http://json2csharp.com

完全な例は次のとおりです。

C#コード:

var targetsObject = Newtonsoft.Json.JsonConvert.DeserializeObject<YourModel>(jsonString); 

JSON:

{ 
     "investors": [ 
     { 
      "name": "06", 
      "programs": [ 
      { 
       "name": "Conventional", 
       "value": "3.5" 
      }, 
      { 
       "name": "FHA - Standard", 
       "value": "5.0" 
      }, 
      { 
       "name": "FHA - Streamline", 
       "value": "" 
      }, 
      { 
       "name": "VA", 
       "value": "5.5" 
      }, 
      { 
       "name": "VA IRRRL", 
       "value": "6.0" 
      }, 
      { 
       "name": "Non-Prime", 
       "value": "" 
      } 
      ] 
     }, 
     { 
      "name": "07", 
      "programs": [ 
      { 
       "name": "Conventional", 
       "value": "3.5" 
      }, 
      { 
       "name": "FHA - Standard", 
       "value": "5.0" 
      }, 
      { 
       "name": "FHA - Streamline", 
       "value": "7.0" 
      }, 
      { 
       "name": "VA", 
       "value": "5.5" 
      }, 
      { 
       "name": "VA IRRRL", 
       "value": "" 
      }, 
      { 
       "name": "Non-Prime", 
       "value": "" 
      } 
      ] 
     }, 
     { 
      "name": "08", 
      "programs": [ 
      { 
       "name": "Conventional", 
       "value": "3.5" 
      }, 
      { 
       "name": "FHA - Standard", 
       "value": "5.0" 
      }, 
      { 
       "name": "FHA - Streamline", 
       "value": "7.0" 
      }, 
      { 
       "name": "VA", 
       "value": "5.5" 
      }, 
      { 
       "name": "VA IRRRL", 
       "value": "" 
      }, 
      { 
       "name": "Non-Prime", 
       "value": "" 
      } 
      ] 
     }, 
     { 
      "name": "09", 
      "programs": [ 
      { 
       "name": "Conventional", 
       "value": "3.5" 
      }, 
      { 
       "name": "FHA - Standard", 
       "value": "5.0" 
      }, 
      { 
       "name": "FHA - Streamline", 
       "value": "" 
      }, 
      { 
       "name": "VA", 
       "value": "5.5" 
      }, 
      { 
       "name": "VA IRRRL", 
       "value": "" 
      }, 
      { 
       "name": "Non-Prime", 
       "value": "" 
      } 
      ] 
     }, 
     { 
      "name": "10", 
      "programs": [ 
      { 
       "name": "Conventional", 
       "value": "" 
      }, 
      { 
       "name": "FHA - Standard", 
       "value": "" 
      }, 
      { 
       "name": "FHA - Streamline", 
       "value": "" 
      }, 
      { 
       "name": "VA", 
       "value": "" 
      }, 
      { 
       "name": "VA IRRRL", 
       "value": "" 
      }, 
      { 
       "name": "Non-Prime", 
       "value": "2.0" 
      } 
      ] 
     }, 
     { 
      "name": "11", 
      "programs": [ 
      { 
       "name": "Conventional", 
       "value": "3.5" 
      }, 
      { 
       "name": "FHA - Standard", 
       "value": "5.0" 
      }, 
      { 
       "name": "FHA - Streamline", 
       "value": "" 
      }, 
      { 
       "name": "VA", 
       "value": "6.0" 
      }, 
      { 
       "name": "VA IRRRL", 
       "value": "6.0" 
      }, 
      { 
       "name": "Non-Prime", 
       "value": "" 
      } 
      ] 
     }, 
     { 
      "name": "12", 
      "programs": [ 
      { 
       "name": "Conventional", 
       "value": "3.5" 
      }, 
      { 
       "name": "FHA - Standard", 
       "value": "5.0" 
      }, 
      { 
       "name": "FHA - Streamline", 
       "value": "" 
      }, 
      { 
       "name": "VA", 
       "value": "5.5" 
      }, 
      { 
       "name": "VA IRRRL", 
       "value": "6.0" 
      }, 
      { 
       "name": "Non-Prime", 
       "value": "" 
      } 
      ] 
     }, 
     { 
      "name": "13", 
      "programs": [ 
      { 
       "name": "Conventional", 
       "value": "" 
      }, 
      { 
       "name": "FHA - Standard", 
       "value": "5.0" 
      }, 
      { 
       "name": "FHA - Streamline", 
       "value": "" 
      }, 
      { 
       "name": "VA", 
       "value": "" 
      }, 
      { 
       "name": "VA IRRRL", 
       "value": "" 
      }, 
      { 
       "name": "Non-Prime", 
       "value": "2.0" 
      } 
      ] 
     } 
     ] 
    } 

モデル:

public class Program 
    { 
     public string name { get; set; } 
     public string value { get; set; } 
    } 

    public class Investor 
    { 
     public string name { get; set; } 
     public List<Program> programs { get; set; } 
    } 

    public class RootObject 
    { 
     public List<Investor> investors { get; set; } 
    } 
関連する問題