如何将json反序列化为有效json但不遵循标准对象模式的c#,因为它没有基本参数对

时间:2018-02-14 01:17:18

标签: json json.net

我有以下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中添加了第二个项目,因为这将是一个项目列表。我以前只包括一个显示项目结构。

1 个答案:

答案 0 :(得分:0)

您需要反序列化为List<Dictionary<string, ThemeMyLogin>>,如下所示:

var root = JsonConvert.DeserializeObject<List<Dictionary<string, ThemeMyLogin>>>(json);

代码生成网站http://json2csharp.com/有一些您需要注意的限制:

  1. JSON standard允许两种类型的容器:

    • 数组,是有序的值集合。数组以[(左括号)开头,以](右括号)结尾。值以,(逗号)分隔。

    • 对象,是一组无序的名称/值对。对象以{(左大括号)开头,以}(右大括号)结束。


    如果您的根容器是一个数组,http://json2csharp.com/将自动生成RootObject模型以反序列化数组中的每个对象。要实际反序列化整个数组,您需要反序列化为根对象集合,例如List<RootObject>。请参阅 Serialization Guide: IEnumerable, Lists, and Arrays

  2. 当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? 和其他地方所涵盖的内容:

  3. 您似乎遇到了这两个限制。工作样本.Net fiddle