2016-12-05 7 views
0

単一の値と配列の値が混在するjson辞書をC#の具体的なオブジェクトに変換する方法については、誰も提案していません。辞書int、ダイナミックは動作しません以下のjsonを参照してください。 JArrayは、JSONの配列を表し、JSONを混合値のCシャープ辞書に変換する

Newtonsoftで
public Dictionary<string, object> ParseJson(string json) { 

    var obj = JObject.Parse(json); 

    var dict = new Dictionary<string, object>(); 

    foreach (var property in obj) { 
     var name = property.Key; 
     var value = property.Value; 

     if (value is JArray) { 
      dict.Add(name, value.ToArray()); 
     } 
     else if (value is JValue) { 
      dict.Add(name, value.ToString()); 
     } 
     else { 
      throw new NotSupportedException("Invalid JSON token type."); 
     } 
    } 

    return dict;  
} 

JObjectは、任意のJSONオブジェクトを表すクラスであり、そしてJValueはスカラーを表し:Newtonsoft.JSONパッケージに

{ 
    "outcome": "SUCCESS", 
    "response": { 
     "249998": "1203088", 
     "249999": "1203091", 
     "250000": "1203093", 
     "250001": "1203095", 
     "250003": "1203096", 
     "250004": "1203102", 
     "250005": "1203107", 
     "250006": { 
      "1203109": 1, 
      "1203110": 0, 
      "1203111": 0, 
      "1203112": 0, 
      "1203113": 0, 
      "1203114": 0, 
      "1203115": 0, 
      "1203116": 0, 
      "1203117": 0, 
      "1203118": 0, 
      "1203119": 0, 
      "1203120": 0 
     }, 
     "250007": { 
      "1203121": 0, 
      "1203122": 0, 
      "1203123": 0, 
      "1203124": 0, 
      "1203125": 1, 
      "1203126": 0, 
      "1203127": 0, 
      "1203128": 0 
     }, 
     "250008": { 
      "1203129": "fcdvgbjkl;" 
     }, 
     "250010": "1203130", 
     "250011": "1203135", 
     "250012": "1203140", 
     "250013": "1203145", 
     "250014": "1203150", 
     "250015": "1203155", 
     "250017": "1203160", 
     "250018": "1203165", 
     "250019": "1203170", 
     "250020": "1203175", 
     "250021": "1203181", 
     "250023": "1203183", 
     "250024": "1203188", 
     "250025": "1203193", 
     "250026": "1203198", 
     "250027": "1203203", 
     "250028": "1203208", 
     "250029": "1203213", 
     "250030": "1203219", 
     "250031": { 
      "1203221": 0, 
      "1203222": 0, 
      "1203223": 0, 
      "1203224": 0, 
      "1203225": 1, 
      "1203226": 0, 
      "1203231": 0 
     }, 
     "250036": { 
      "1203236": 0, 
      "1203237": 0, 
      "1203238": 0, 
      "1203243": 0, 
      "1203244": 0, 
      "1203245": 0, 
      "1203246": 1, 
      "1203247": 0, 
      "1203248": 0, 
      "1203249": 0, 
      "1203250": 0, 
      "1203251": 0, 
      "1203252": 0, 
      "1203253": 0, 
      "1203254": 0, 
      "1203255": 0, 
      "1203256": 0, 
      "1203257": 0, 
      "1203258": 0, 
      "1203259": 0 
     }, 
     "250041": { 
      "1203264": "gjhgjhg" 
     }, 
     "250045": { 
      "1203269": 0 
     } 
    } 
} 
+1

可能性のある重複した以下のコードのような複数のレベルのオブジェクトを必要とする[カスタムC#のオブジェクトにJSONオブジェクトを変換する方法?](http://stackoverflow.com/questions/2246694/how-to-convert-json -object-to-custom-c-sharp-object) –

+0

ダイナミックタイプを使用するときのエラーは何ですか? – PMerlet

+0

Newtonsoft:その他の情報:型にJSON配列(例:[1,2,3])が必要なため、現在のJSONオブジェクト(例:{"name": "value"})をタイプ 'System.Object []'にデシリアライズできません正しくデシリアライズします。 –

答えて

0

は、あなたがこのような何かを行うことができます値。

このメソッドでは、入力文字列をJObjectとして解析します。これは、ネストされたオブジェクト、配列なども再帰的に解析します。次に、結果として使用する空のDictionary<string, object>を作成します。次に、解析されたJObjectのトップレベルのプロパティをループし、各プロパティについて、値が配列の場合はそれをdictに追加します。スカラーならそれを追加し、ネストされたオブジェクトNotSupportedExceptionを投げます。最後に辞書が返されます。

あなたの場合、文字列ではなく多くの整数があるので、Int32.TryParseコールを振りかざす必要があります。

+0

ありがとうございます。私もjobjectとJarrayを試しました。私はこのJSONはちょうど良いJSONではないと思う。 Idのものは、キーというよりもプロパティ名のように使われている。 –

+0

ああそうだ。ここでは実際には 'JObject'をネストしています。子の' JArrays'を持つマスター 'JObject'ではありません。 'JObject.Parse'を呼び出して、メモリ内の' JObject'を使って作業すれば、とても便利です。しかし、標準のコレクションに変換したい場合は、投稿したものと同様の方法で元のオブジェクトを再帰的に掘り下げなければなりません。着信JSONの構造について何か保証されていますか?そうであれば、オブジェクトグラフを表すためのいくつかの基本クラスを作成することができます。 – JamesFaix

+0

ああ、私はJobject.Parseについて忘れてしまっただけで、単純にジョブに逆直列化しようとしていました。それは動作します。私は実際に仕事を発掘するのに必要な愚かなロジックをすべて書きたいと思っているかどうかを判断することができます。ありがとうございました –

0

オブジェクトは、文字列または整数のいずれかを受け入れる辞書の値として使用できます。あなたがの

public class MyClass 
    { 
     Dictionary<int, int> dict = new Dictionary<int, int>(); 
     Dictionary<int, object> childDict = new Dictionary<int, object>(); 
    }