使用C#解析复杂的JSON对象

时间:2012-11-29 15:51:13

标签: c# json

我有一个像这样的JSON:

{
    "name" : "MyCustomName",
    "my_node" : {
        "name" : "my_node_name"
    },
    "dict1":"value1",
    "dict2":"value2",
    "dict3":"value3",
    ...
}

和一个对象:

class Node{
    string value;
}

class Sample:IDictionary<string, string>{ 
    Node node;
    string name; 
} 
始终存在Sample类中的

节点名称。 问题是我不知道有多少“dictN”字段......这就是重点。

问题是: 如何将JSON反序列化为此对象?

3 个答案:

答案 0 :(得分:2)

编辑:显然,即使字段名称协调一致,您的解串器也无法处理与常规字典字段相结合的特定字段。

在这种情况下,我只是建议将反序列化为Dictionary<string, object>并使用结果进行构建:

var d = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(json);
Sample s = new Sample();
s.name = (string)d["name"];
Node n = new Node();
n.value = (string)((Dictionary<string, object>)d["my_node"])["name"];
foreach (var key in d.Keys.Except(new string[] { "name", "my_node" }))
{
    s.Add(key, (string)d[key]);
}

答案 1 :(得分:1)

INITIAL IDEA

以下是字典序列化程序。它有一个不接受空字符串的特殊情况。

private void SerializePerinatalModel<T>(IDictionary<string, object> dataModel, T perinatalModel)
    {
        Type sourceType = typeof(T);
        foreach (PropertyInfo propInfo in (sourceType.GetProperties()))
        {
            if (dataModel.ContainsKey(propInfo.Name))
            {
                //  if an empty string has been returned don't change the value
                if (dataModel[propInfo.Name].ToNullSafeString() != String.Empty)
                {
                    try
                    {
                        Type localType = propInfo.PropertyType;
                        localType = Nullable.GetUnderlyingType(localType) ?? localType;
                        propInfo.SetValue(perinatalModel, Convert.ChangeType(dataModel[propInfo.Name], localType), null); 
                    }
                    catch (Exception e)
                    {
                        //  ToDo: log update value errors
                    }

                }
            }

        }
    }

但可以使其安全无效。它确实处理可空类型。

由于JSON本质上是一种字典类型,因此迭代顶级类型应该可以帮助您。

这是用匆忙写的,所以只是一个想法的草图。

更好的想法 也可以尝试使用

foreach (var item in JsonData.Where(m => m.Key.Substring(0,4) == "dict"))
{
   // add item to collection
}

也可以做商业。

答案 2 :(得分:1)

您可以简单地以Dictionary<string, object>的形式输出,请尝试使用这段代码。

System.Web.Script.Serialization.JavaScriptSerializer s = 
    new System.Web.Script.Serialization.JavaScriptSerializer();

var nodes = s.Deserialize<Dictionary<string, object>>(jsonString);
var dictNodes = nodes.Where(w => w.Key.StartsWith("dict"));