我有以下JSON:
[{
"theme-my-login":
{
"latest_version":"6.4.7",
"last_updated":"2017-01-06T18:14:00.000Z",
"popular":true,
"vulnerabilities":
[
{
"id":6043,
"title":"Theme My Login 6.3.9 - Local File Inclusion",
"created_at":"2014-08-01T10:58:35.000Z",
"updated_at":"2015-05-15T13:47:24.000Z",
"published_date":null,
"references":
{
"url":["http://packetstormsecurity.com/files/127302/","http://seclists.org/fulldisclosure/2014/Jun/172","http://www.securityfocus.com/bid/68254/","https://security.dxw.com/advisories/lfi-in-theme-my-login/"]
},
"vuln_type":"LFI",
"fixed_in":"6.3.10"
}
]
}
},{
"other-item":
{
"latest_version":"6.4.7",
"last_updated":"2017-01-06T18:14:00.000Z",
"popular":true,
"vulnerabilities":
[
{
"id":6043,
"title":"Theme My Login 6.3.9 - Local File Inclusion",
"created_at":"2014-08-01T10:58:35.000Z",
"updated_at":"2015-05-15T13:47:24.000Z",
"published_date":null,
"references":
{
"url":["http://packetstormsecurity.com/files/127302/","http://seclists.org/fulldisclosure/2014/Jun/172","http://www.securityfocus.com/bid/68254/","https://security.dxw.com/advisories/lfi-in-theme-my-login/"]
},
"vuln_type":"LFI",
"fixed_in":"6.3.10"
}
]
}
}]
json2csharp说对象模型应该是这样的,但这显然不正确
public class References
{
public List<string> url { get; set; }
}
public class Vulnerability
{
public int id { get; set; }
public string title { get; set; }
public DateTime created_at { get; set; }
public DateTime updated_at { get; set; }
public object published_date { get; set; }
public References references { get; set; }
public string vuln_type { get; set; }
public string fixed_in { get; set; }
}
public class ThemeMyLogin
{
public string latest_version { get; set; }
public DateTime last_updated { get; set; }
public bool popular { get; set; }
public List<Vulnerability> vulnerabilities { get; set; }
}
public class RootObject
{
public ThemeMyLogin __invalid_name__theme-my-login { get; set; }
}
我正在尝试使用Json.NET反序列化为c#类,但由于顶级项目没有传统名称:值对(名称实际上是“theme-my-login”,值为对象),它不是反序列化。 有关如何将其反序列化的任何指示?我是否需要使用自定义反序列化器?
我无法使用How can I parse a JSON string that would cause illegal C# identifiers?中建议的字典的原因是我需要将值“theme-my-login”作为我的模型中的一个值,因为它定义了对象。我已经在json中添加了第二个项目,因为这将是一个项目列表。我以前只包括一个显示项目结构。
答案 0 :(得分:0)
您需要反序列化为List<Dictionary<string, ThemeMyLogin>>
,如下所示:
var root = JsonConvert.DeserializeObject<List<Dictionary<string, ThemeMyLogin>>>(json);
代码生成网站http://json2csharp.com/有一些您需要注意的限制:
JSON standard允许两种类型的容器:
数组,是有序的值集合。数组以[
(左括号)开头,以]
(右括号)结尾。值以,
(逗号)分隔。
对象,是一组无序的名称/值对。对象以{
(左大括号)开头,以}
(右大括号)结束。
如果您的根容器是一个数组,http://json2csharp.com/将自动生成RootObject
模型以反序列化数组中的每个对象。要实际反序列化整个数组,您需要反序列化为根对象集合,例如List<RootObject>
。请参阅 Serialization Guide: IEnumerable, Lists, and Arrays 。
当JSON属性对应于无效的c#标识符时,http://json2csharp.com/将“有用”地将属性添加到包含如下所示的类型:
public PropertyType __invalid_name__my-invalid-identifier { get; set; }
当然这不会编译,因此您需要注意任何__invalid_name
属性并手动修复生成的代码。执行此操作的选项包括 How can I parse a JSON string that would cause illegal C# identifiers? 和其他地方所涵盖的内容:
如果属性名称已修复且事先已知,请将c#属性重命名为与您的编码约定一致的有效内容,并使用[JsonProperty("my-invalid-identifier")]
进行标记。 (从answer到ken2k)。
如果包含类型完全由变量属性名称组成,并且其值对应于某些类型T
,则使用固定模式替换包含类型Dictionary<string, T>
。 (来自answer L.B。)
如果包含的对象混合了固定和可变属性,请参阅 Deserialize json with known and unknown fields 或 How to deserialize a child object with dynamic (numeric) key names? 。
您似乎遇到了这两个限制。工作样本.Net fiddle。