2016-12-05 111 views
0

有没有人对如何将具有混合单个值和数组值的json字典转换为C#具体对象有任何建议。 Dictionary int,dynamic不起作用,请参阅下面的json。将JSON转换为具有混合值的c sharp字典

{ 
    "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

可能的重复代码多级的对象[如何转换JSON对象为自定义C#对象?(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

随着Newtonsoft.JSON包,你可以做这样的事情:

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;  
} 

在Newtonsoft,JObject是表示任何JSON对象的类,JArray代表一个JSON数组,并JValue代表标值。

在这种方法中,我们将传入的字符串解析为JObject,这也将递归地解析任何嵌套的对象,数组等等。然后我们创建一个空的Dictionary<string, object>作为我们的结果。然后我们遍历解析的JObject的顶层属性,并且对于每个属性,如果该值是一个数组,我们将其添加到我们的词典中,如果它的标量我们添加它,并且如果它的其他东西像一个嵌套的对象它抛出一个NotSupportedException。最后返回字典。

在你的情况下,有很多整数,而不是字符串,所以你可能需要洒一些Int32.TryParse调用。

+0

谢谢。我也尝试了jobject和Jarray。我认为这个JSON只是不好json。 Id的使用更像属性名称而不是钥匙 –

+0

啊,我明白了。所以在这里你实际上嵌套了'JObject',而不是具有子'JArrays'的主''JObject'。你可以调用'JObject.Parse'并且在内存中使用'JObject',它们真的很方便。如果你想转换为标准集合,你必须以类似于我发布的方式递归地挖掘原始对象。关于你的JSON结构有什么担保?如果是这样,您可能需要创建几个基本类来表示对象图。 – JamesFaix

+0

啊,我忘记了Jobject.Parse,只是试图反序列化为工作项目。这样可行。现在决定我是否真的想写出挖掘工作项目所需的所有愚蠢逻辑。谢谢 –

0

您可以使用object作为接受字符串或整数的字典的值。你需要像下面

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