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