3

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

4

3 回答 3

2

编辑:显然,即使字段名称协调一致,您的反序列化器也无法处理与通用字典字段相结合的特定字段。

在这种情况下,我只是建议反序列化为 aDictionary<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]);
}
于 2012-11-29T15:57:41.537 回答
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"));
于 2012-11-29T16:09:59.810 回答
1

最初的想法

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

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
                    }

                }
            }

        }
    }

但可以使 null 安全。它确实处理可为空的类型。

由于 JSON 本质上是一种字典类型,因此遍历顶级类型应该可以让您到达那里。

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

更好的想法 也尝试使用

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

也可以做生意。

于 2012-11-29T16:06:51.103 回答