1

在过去的几天里,我一直在玩这个,我希望有人可以阐明这个问题可能是什么。

我有我创建的这个自定义对象:

public class WorldInformation
{
    public string ID { get; set; }
    public string name { get; set; }
}

这个 JSON 数据:

string world = "[{\"id\":\"1016\",\"name\":\"Sea of Sorrows\"}, {\"id\":\"1008\",\"name\":\"Jade Quarry\"},{\"id\":\"1017\",\"name\":\"Tarnished Coast\"},{\"id\":\"1006\",\"name\":\"Sorrow's Furnace\"},{\"id\":\"2014\",\"name\":\"Gunnar's Hold\"}]";

我可以通过反序列化成功地将数据保存在我的自定义对象中:

List<WorldInformation> worlds = JsonConvert.DeserializeObject<List<WorldInformation>>(world);

但...

当我创建这样的自定义对象时

public class EventItems
{
    public string World_ID { get; set; }
    public string Map_ID { get; set; }
    public string Event_ID { get; set; }
    public string State { get; set; }        
}

并有这样的 JSON 数据:

string eventItem = "{\"events\":[{\"world_id\":1011,\"map_id\":50,\"event_id\":\"BAD81BA0-60CF-4F3B-A341-57C426085D48\",\"state\":\"Active\"},{\"world_id\":1011,\"map_id\":50,\"event_id\":\"330BE72A-5254-4036-ACB6-7AEED05A521C\",\"state\":\"Active\"},{\"world_id\":1011,\"map_id\":21,\"event_id\":\"0AC71429-406B-4B16-9F2F-9342097A50AD\",\"state\":\"Preparation\"},{\"world_id\":1011,\"map_id\":21,\"event_id\":\"C20D9004-DF6A-4217-BF25-7D6B5788A94C\",\"state\":\"Success\"}]}";

尝试反序列化时出现错误

 List<EventItems> events = JsonConvert.DeserializeObject<List<EventItems>>(eventItem);

我得到的错误信息是:

无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型“System.Collections.Generic.List`1[WebApplication1.EventItems]”,因为该类型需要 JSON 数组(例如 [1,2, 3])正确反序列化。

要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其成为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是像这样的集合类型可以从 JSON 对象反序列化的数组或列表。JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。

路径“事件”,第 1 行,位置 10。

4

3 回答 3

3

在第一种情况下,您的 json 是对象数组,因此反序列化为您的类类型列表成功。在第二种情况下,您的 json 是一个对象,并且它的“事件”属性设置为一个对象数组,因此它不能反序列化为一个列表。

你可以做的是改变你的类声明:

public class EventItem
{
    public string World_ID { get; set; }
    public string Map_ID { get; set; }
    public string Event_ID { get; set; }
    public string State { get; set; }        
}

public class EventItems
{
    public EventItem[] Events { get; set; }
}

并反序列化它:

EventItems events = JsonConvert.DeserializeObject<EventItems>(eventItem);
于 2013-07-06T17:26:40.353 回答
3

不幸的是,没有办法指定根 Json 元素,如XmlSerializer.

请参阅如何使用 Json.NET 为数组中的每个对象反序列化带有“根”元素的 JSON 数组?

public class EventItems
{
    public EventItems()
    {
        Events = new List<EventItem>();
    }

    public List<EventItem> Events { get; set; }
}

public class EventItem
{
    public string World_ID { get; set; }
    public string Map_ID { get; set; }
    public string Event_ID { get; set; }
    public string State { get; set; }        
}

用法:

string eventItem = "{\"events\":[{\"world_id\":1011,\"map_id\":50,\"event_id\":\"BAD81BA0-60CF-4F3B-A341-57C426085D48\",\"state\":\"Active\"},{\"world_id\":1011,\"map_id\":50,\"event_id\":\"330BE72A-5254-4036-ACB6-7AEED05A521C\",\"state\":\"Active\"},{\"world_id\":1011,\"map_id\":21,\"event_id\":\"0AC71429-406B-4B16-9F2F-9342097A50AD\",\"state\":\"Preparation\"},{\"world_id\":1011,\"map_id\":21,\"event_id\":\"C20D9004-DF6A-4217-BF25-7D6B5788A94C\",\"state\":\"Success\"}]}";

var items = JsonConvert.DeserializeObject<EventItems>(eventItem);
于 2013-07-06T17:29:12.490 回答
1

只需从第二个 JSON 字符串中删除对象事件:

string eventItem = "[{\"world_id\":1011,\"map_id\":50,\"event_id\":\"BAD81BA0-60CF-4F3B-A341-57C426085D48\",\"state\":\"Active\"},{\"world_id\":1011,\"map_id\":50,\"event_id\":\"330BE72A-5254-4036-ACB6-7AEED05A521C\",\"state\":\"Active\"},{\"world_id\":1011,\"map_id\":21,\"event_id\":\"0AC71429-406B-4B16-9F2F-9342097A50AD\",\"state\":\"Preparation\"},{\"world_id\":1011,\"map_id\":21,\"event_id\":\"C20D9004-DF6A-4217-BF25-7D6B5788A94C\",\"state\":\"Success\"}]";

看来您的 JSON 字符串在两个示例中都不相同。在第一个示例中,您使用的是一个简单的 JSON 数组:

[
    {
        "id": "1016",
        "name": "Sea of Sorrows"
    },
    {
        "id": "1008",
        "name": "Jade Quarry"
    },
    {
        "id": "1017",
        "name": "Tarnished Coast"
    },
    {
        "id": "1006",
        "name": "Sorrow's Furnace"
    },
    {
        "id": "2014",
        "name": "Gunnar's Hold"
    }
]

在第二个示例中,您将数组分配给一个对象(events):

{
    "events": 
    [
        {
            "world_id": 1011,
            "map_id": 50,
            "event_id": "BAD81BA0-60CF-4F3B-A341-57C426085D48",
            "state": "Active"
        },
        {
            "world_id": 1011,
            "map_id": 50,
            "event_id": "330BE72A-5254-4036-ACB6-7AEED05A521C",
            "state": "Active"
        },
        {
            "world_id": 1011,
            "map_id": 21,
            "event_id": "0AC71429-406B-4B16-9F2F-9342097A50AD",
            "state": "Preparation"
        },
        {
            "world_id": 1011,
            "map_id": 21,
            "event_id": "C20D9004-DF6A-4217-BF25-7D6B5788A94C",
            "state": "Success"
        }
    ]
}
于 2013-07-06T17:30:23.483 回答