2013-07-06 241 views
1

过去几天我一直在玩这个游戏,我希望有人能够对这个问题有所了解。将JSON数据保存到C#自定义对象中

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

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类型(例如,不是像整数这样的基本类型,不是像数组或List的集合类型),可以从JSON对象反序列化。 JsonObjectAttribute也可以添加到类型中,以强制它从JSON对象反序列化。

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

回答

3

Unforturnately没有指定像XmlSerializer根的Json元素的方式。

How to deserialize JSON array with "root" element for each object in array using Json.NET?

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); 
+0

谢谢,Romoku。这工作完美 – Robert

+0

我很高兴你发现它有帮助! – Romoku

3

在第一种情况下你的JSON是对象数组,所以反序列化到你的类类型的列表成功。 在第二种情况下,你的json是一个对象,它的“events”属性被设置为一个对象数组,所以它不能被反序列化到一个列表中。

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

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); 
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": 
    [ 
     { 
      "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" 
     } 
    ] 
} 
+0

他可能无法控制生成的JSON。 –

+0

我想从字符串中删除“events”项,但Yaniv是正确的,我没有JSON数据的控制权。 – Robert

相关问题