2016-07-16 10 views
3

私はこのJSONを持っていると私はそれをデシリアライズする必要があります。C#のデシリアライズJSON不明のキー

{ 
    "homepage": "http://files.minecraftforge.net/maven/net/minecraftforge/forge/", 
    "promos": { 
    "1.10-latest": "12.18.0.2000", 
    "1.10.2-latest": "12.18.1.2014", 
    "1.10.2-recommended": "12.18.1.2011", 
    "1.5.2-latest": "7.8.1.738", 
    "1.5.2-recommended": "7.8.1.737", 
    "1.6.1-latest": "8.9.0.775", 
    "1.6.2-latest": "9.10.1.871", 
    "1.6.2-recommended": "9.10.1.871", 
    "1.6.3-latest": "9.11.0.878", 
    "1.6.4-latest": "9.11.1.1345", 
    "1.6.4-recommended": "9.11.1.1345", 
    "1.7.10-latest": "10.13.4.1614", 
    "1.7.10-latest-1.7.10": "10.13.2.1343", 
    "1.7.10-recommended": "10.13.4.1558", 
    "1.7.2-latest": "10.12.2.1147", 
    "1.7.2-recommended": "10.12.2.1121", 
    "1.8-latest": "11.14.4.1577", 
    "1.8-recommended": "11.14.4.1563", 
    "1.8.8-latest": "11.15.0.1655", 
    "1.8.9-latest": "11.15.1.1902", 
    "1.8.9-recommended": "11.15.1.1722", 
    "1.9-latest": "12.16.0.1942", 
    "1.9-recommended": "12.16.1.1887", 
    "1.9.4-latest": "12.17.0.1990", 
    "1.9.4-recommended": "12.17.0.1976", 
    "latest": "12.18.1.2014", 
    "latest-1.7.10": "10.13.2.1343", 
    "recommended": "12.18.1.2011" 
    } 
} 

は、このウェブサイトに多くの検索、私はこのコードで出てきた:

dynamic json = JsonConvert.DeserializeObject<Dictionary<string, string>>(data); 
foreach (KeyValuePair<string, string> entry in json["promos"]) 
{ 
    MessageBox.Show(entry.Key); 
    MessageBox.Show(entry.Value); 
} 

私がする必要がありますそのJsonからKeyとValueの両方を取得しますが、このコードでは、3番目の行13に予期しない文字があると言います。 私はさまざまな方法で試しましたが、同時に値とキーを取得できません。いくつかのコードでは私はちょうど鍵を持っていて、他のコードではちょうど価値があります。価値と鍵の両方を得る方法を私に説明できますか?

答えて

2

あなたが直接、jオブジェクトとしてJSONを解析し、辞書にノード「プロモーション」を変換することができ

var json = JObject.Parse(data); 
var promos = json["promos"].ToObject<Dictionary<string, string>>(); 
foreach (var entry in promos) 
{ 
    MessageBox.Show(entry.Key); 
    MessageBox.Show(entry.Value); 
} 
+0

これは完全に機能します!本当にありがとう! – ThePHPAddicted

0

問題は、逆シリアル化しようとしているタイプです。 これを辞書として逆シリアル化しようとしていますが、最初のエントリが文字列のペアである間に、プロモーションは辞書そのものなので、 "promos"の値を文字列にキャストできません! あなたのJSONを想定すると、「json.json」あなたがプロモーションJOBJECTを反復処理することにより、辞書を取得し、あなたがこのような方法で、JPropertyに求める項目をキャストすることができますと呼ばれるファイルにあります。

var json = File.ReadAllText("json.json"); 
var deserialized = JsonConvert.DeserializeObject<JObject>(json); 

var dictionary = new Dictionary<string, string>(); 

foreach (JProperty item in deserialized["promos"]) 
    dictionary.Add(item.Name, item.Value.ToString()); 
0

あなたのデータではありませんpromosの値がstringではなく、辞書であるため、Dictionary<string, string>です。

JObjectにデシリアライズしてpromosプロパティの値を取得できます。

JObject json = JsonConvert.DeserializeObject<JObject>(data); 
//var promos = json.Value<Dictionary<string, string>>("promos"); 
var promos = data["promos"].ToObject<Dictionary<string, string>>(); 
foreach (KeyValuePair<string, string> entry in promos) { 
    //do some stuff 
} 

EDIT

わからない、なぜ元の方法は動作しませんし、調査するために、今の時間を持っていないが、二行目はそれを行う必要があります。 newtonsoft.json.linq.jtokenにnewtonsoft.json.linq.jobjectキャストできません:

+0

それはSystem.InvalidCastExceptionのは言います。どういう意味ですか?どうすれば解決できますか? – ThePHPAddicted

関連する問題