繁体   English   中英

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

[英]Parsing complex JSON Object with C#

我有一个像这样的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反序列化为此对象?

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

在这种情况下,我只是建议将反序列化为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]);
}

初步的想法

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

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
}

也可能做这个商业。

你可以简单地以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"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM