json 使用 json.net 进行 C# 反序列化
json to c# deserialization with json.net
我知道有无数关于json反序列化的帖子,但我已经按照大多数帖子的答案进行操作,但没有成功。我认为我的主要问题是我似乎无法理解 Json 实际上是如何在结构上构建的。
我有以下来自 API 的 Json 字符串:
{
"totalCount_str": "3",
"items": [
{
"standing": 10,
"corporation": {
"name": "borkedLabs",
"isNPC": false,
"href": "https://crest-tq.eveonline.com/corporations/98046548/",
"id_str": "98046548",
"logo": {
"32x32": {
"href": "http://imageserver.eveonline.com/Corporation/98046548_32.png"
},
"64x64": {
"href": "http://imageserver.eveonline.com/Corporation/98046548_64.png"
},
"128x128": {
"href": "http://imageserver.eveonline.com/Corporation/98046548_128.png"
},
"256x256": {
"href": "http://imageserver.eveonline.com/Corporation/98046548_256.png"
}
},
"id": 98046548
},
"href": "https://crest-tq.eveonline.com/characters/94512721/contacts/98046548/",
"contact": {
"id_str": "98046548",
"href": "https://crest-tq.eveonline.com/corporations/98046548/",
"name": "borkedLabs",
"id": 98046548
},
"contactType": "Corporation"
},
{
"standing": 10,
"character": {
"name": "xxxx yyyy",
"corporation": {
"name": "xxyshs",
"isNPC": false,
"href": "https://crest-tq.eveonline.com/corporations/98401169/",
"id_str": "98401169",
"logo": {
"32x32": {
"href": "http://imageserver.eveonline.com/Corporation/98401169_32.png"
},
"64x64": {
"href": "http://imageserver.eveonline.com/Corporation/98401169_64.png"
},
"128x128": {
"href": "http://imageserver.eveonline.com/Corporation/98401169_128.png"
},
"256x256": {
"href": "http://imageserver.eveonline.com/Corporation/98401169_256.png"
}
},
"id": 98401169
},
"isNPC": false,
"href": "https://crest-tq.eveonline.com/characters/95161569/",
"capsuleer": {
"href": "https://crest-tq.eveonline.com/characters/95161569/capsuleer/"
},
"portrait": {
"32x32": {
"href": "http://imageserver.eveonline.com/Character/95161569_32.jpg"
},
"64x64": {
"href": "http://imageserver.eveonline.com/Character/95161569_64.jpg"
},
"128x128": {
"href": "http://imageserver.eveonline.com/Character/95161569_128.jpg"
},
"256x256": {
"href": "http://imageserver.eveonline.com/Character/95161569_256.jpg"
}
},
"id": 95161569,
"id_str": "95161569"
},
"contact": {
"id_str": "95161569",
"href": "https://crest-tq.eveonline.com/characters/95161569/",
"name": "xxxx yyyy",
"id": 95161569
},
"href": "https://crest-tq.eveonline.com/characters/94512769/contacts/95161569/",
"contactType": "Character",
"watched": false,
"blocked": false
},
{
"standing": -10,
"alliance": {
"id_str": "99000003",
"href": "http://crest.regner.dev/alliances/99000003/",
"id": 99000003,
"name": "One One Corporation Alliance"
},
"href": "http://crest.regner.dev/characters/90000001/contacts/99000003/",
"contact": {
"id_str": "99000003",
"href": "http://crest.regner.dev/alliances/99000003/",
"name": "One One Corporation Alliance",
"id": 99000003
},
"contactType": "Alliance"
}
],
"pageCount": 1,
"pageCount_str": "1",
"totalCount": 3
}
请注意,items 数组可以包含任意数量的 "contacts"。
通过使用 http://json2csharp.com/,我在 C# 中将其转换为 类,如下所示:
public class Contacts
{
public string totalCount_str { get; set; }
public Item[] items { get; set; }
public int pageCount { get; set; }
public string pageCount_str { get; set; }
public int totalCount { get; set; }
}
public class Item
{
public int standing { get; set; }
public Alliance alliance { get; set; }
public string href { get; set; }
public Contact contact { get; set; }
public string contactType { get; set; }
public Character character { get; set; }
public bool watched { get; set; }
public bool blocked { get; set; }
}
public class Alliance
{
public string id_str { get; set; }
public string href { get; set; }
public int id { get; set; }
public string name { get; set; }
}
public class Contact
{
public string id_str { get; set; }
public string href { get; set; }
public string name { get; set; }
public int id { get; set; }
}
public class Character
{
public string name { get; set; }
public Corporation corporation { get; set; }
public bool isNPC { get; set; }
public string href { get; set; }
public Capsuleer capsuleer { get; set; }
public Portrait portrait { get; set; }
public int id { get; set; }
public string id_str { get; set; }
}
public class Corporation
{
public string name { get; set; }
public bool isNPC { get; set; }
public string href { get; set; }
public string id_str { get; set; }
public Logo logo { get; set; }
public int id { get; set; }
}
public class Logo
{
public _32X32 _32x32 { get; set; }
public _64X64 _64x64 { get; set; }
public _128X128 _128x128 { get; set; }
public _256X256 _256x256 { get; set; }
}
public class _32X32
{
public string href { get; set; }
}
public class _64X64
{
public string href { get; set; }
}
public class _128X128
{
public string href { get; set; }
}
public class _256X256
{
public string href { get; set; }
}
public class Capsuleer
{
public string href { get; set; }
}
public class Portrait
{
public _32X32 _32x32 { get; set; }
public _64X64 _64x64 { get; set; }
public _128X128 _128x128 { get; set; }
public _256X256 _256x256 { get; set; }
}
然后尝试反序列化:
List<Contacts> tempList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Contacts>>(response.Content);
感谢任何帮助我走上正轨的帮助。我目前在尝试这种方式时遇到错误:
Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[ContactWatchlister.Models.Contacts]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
Path 'totalCount_str', line 1, position 18.
我目前陷入困境,因为我不明白为什么它无法将 "totalCount_str" 理解为字符串。
我已经尝试在我的 类 中的所有属性上使用 [JsonProperty("attribute")]
来正确建模,但同样的错误。
我很确定我做的事情相当简单,但我做错了,但我无法理解它。希望你能帮忙! :-)
如果response.Content
包含你描述的JSON字符串我认为语句应该是:
var tempList = Newtonsoft.Json.JsonConvert.DeserializeObject<Contacts>(response.Content);
您的 JSON 在最外面 "level" 有 "totalCount_str"
、items
、pageCount
、pageCount_str
和 totalCount
字段],因此它只能反序列化为具有这些属性的 class(或具有与这些字段名相对应的正确 JsonAttribute
的属性)。
您试过的那个可以与以下 JSON 一起使用,其中最外层的实体是一个数组:
[ {
"totalCount_str": "3",
"items": [
{
"standing": 10,
"corporation": {
"name": "borkedLabs",
"isNPC": false,
"href": "https://crest-tq.eveonline.com/corporations/98046548/",
"id_str": "98046548",
"logo": {
"32x32": {
"href": "http://imageserver.eveonline.com/Corporation/98046548_32.png"
},
"64x64": {
"href": "http://imageserver.eveonline.com/Corporation/98046548_64.png"
},
"128x128": {
"href": "http://imageserver.eveonline.com/Corporation/98046548_128.png"
},
"256x256": {
"href": "http://imageserver.eveonline.com/Corporation/98046548_256.png"
}
},
"id": 98046548
},
"href": "https://crest-tq.eveonline.com/characters/94512721/contacts/98046548/",
"contact": {
"id_str": "98046548",
"href": "https://crest-tq.eveonline.com/corporations/98046548/",
"name": "borkedLabs",
"id": 98046548
},
"contactType": "Corporation"
},
{
"standing": 10,
"character": {
"name": "xxxx yyyy",
"corporation": {
"name": "xxyshs",
"isNPC": false,
"href": "https://crest-tq.eveonline.com/corporations/98401169/",
"id_str": "98401169",
"logo": {
"32x32": {
"href": "http://imageserver.eveonline.com/Corporation/98401169_32.png"
},
"64x64": {
"href": "http://imageserver.eveonline.com/Corporation/98401169_64.png"
},
"128x128": {
"href": "http://imageserver.eveonline.com/Corporation/98401169_128.png"
},
"256x256": {
"href": "http://imageserver.eveonline.com/Corporation/98401169_256.png"
}
},
"id": 98401169
},
"isNPC": false,
"href": "https://crest-tq.eveonline.com/characters/95161569/",
"capsuleer": {
"href": "https://crest-tq.eveonline.com/characters/95161569/capsuleer/"
},
"portrait": {
"32x32": {
"href": "http://imageserver.eveonline.com/Character/95161569_32.jpg"
},
"64x64": {
"href": "http://imageserver.eveonline.com/Character/95161569_64.jpg"
},
"128x128": {
"href": "http://imageserver.eveonline.com/Character/95161569_128.jpg"
},
"256x256": {
"href": "http://imageserver.eveonline.com/Character/95161569_256.jpg"
}
},
"id": 95161569,
"id_str": "95161569"
},
"contact": {
"id_str": "95161569",
"href": "https://crest-tq.eveonline.com/characters/95161569/",
"name": "xxxx yyyy",
"id": 95161569
},
"href": "https://crest-tq.eveonline.com/characters/94512769/contacts/95161569/",
"contactType": "Character",
"watched": false,
"blocked": false
},
{
"standing": -10,
"alliance": {
"id_str": "99000003",
"href": "http://crest.regner.dev/alliances/99000003/",
"id": 99000003,
"name": "One One Corporation Alliance"
},
"href": "http://crest.regner.dev/characters/90000001/contacts/99000003/",
"contact": {
"id_str": "99000003",
"href": "http://crest.regner.dev/alliances/99000003/",
"name": "One One Corporation Alliance",
"id": 99000003
},
"contactType": "Alliance"
}
],
"pageCount": 1,
"pageCount_str": "1",
"totalCount": 3 } ]
我知道有无数关于json反序列化的帖子,但我已经按照大多数帖子的答案进行操作,但没有成功。我认为我的主要问题是我似乎无法理解 Json 实际上是如何在结构上构建的。
我有以下来自 API 的 Json 字符串:
{
"totalCount_str": "3",
"items": [
{
"standing": 10,
"corporation": {
"name": "borkedLabs",
"isNPC": false,
"href": "https://crest-tq.eveonline.com/corporations/98046548/",
"id_str": "98046548",
"logo": {
"32x32": {
"href": "http://imageserver.eveonline.com/Corporation/98046548_32.png"
},
"64x64": {
"href": "http://imageserver.eveonline.com/Corporation/98046548_64.png"
},
"128x128": {
"href": "http://imageserver.eveonline.com/Corporation/98046548_128.png"
},
"256x256": {
"href": "http://imageserver.eveonline.com/Corporation/98046548_256.png"
}
},
"id": 98046548
},
"href": "https://crest-tq.eveonline.com/characters/94512721/contacts/98046548/",
"contact": {
"id_str": "98046548",
"href": "https://crest-tq.eveonline.com/corporations/98046548/",
"name": "borkedLabs",
"id": 98046548
},
"contactType": "Corporation"
},
{
"standing": 10,
"character": {
"name": "xxxx yyyy",
"corporation": {
"name": "xxyshs",
"isNPC": false,
"href": "https://crest-tq.eveonline.com/corporations/98401169/",
"id_str": "98401169",
"logo": {
"32x32": {
"href": "http://imageserver.eveonline.com/Corporation/98401169_32.png"
},
"64x64": {
"href": "http://imageserver.eveonline.com/Corporation/98401169_64.png"
},
"128x128": {
"href": "http://imageserver.eveonline.com/Corporation/98401169_128.png"
},
"256x256": {
"href": "http://imageserver.eveonline.com/Corporation/98401169_256.png"
}
},
"id": 98401169
},
"isNPC": false,
"href": "https://crest-tq.eveonline.com/characters/95161569/",
"capsuleer": {
"href": "https://crest-tq.eveonline.com/characters/95161569/capsuleer/"
},
"portrait": {
"32x32": {
"href": "http://imageserver.eveonline.com/Character/95161569_32.jpg"
},
"64x64": {
"href": "http://imageserver.eveonline.com/Character/95161569_64.jpg"
},
"128x128": {
"href": "http://imageserver.eveonline.com/Character/95161569_128.jpg"
},
"256x256": {
"href": "http://imageserver.eveonline.com/Character/95161569_256.jpg"
}
},
"id": 95161569,
"id_str": "95161569"
},
"contact": {
"id_str": "95161569",
"href": "https://crest-tq.eveonline.com/characters/95161569/",
"name": "xxxx yyyy",
"id": 95161569
},
"href": "https://crest-tq.eveonline.com/characters/94512769/contacts/95161569/",
"contactType": "Character",
"watched": false,
"blocked": false
},
{
"standing": -10,
"alliance": {
"id_str": "99000003",
"href": "http://crest.regner.dev/alliances/99000003/",
"id": 99000003,
"name": "One One Corporation Alliance"
},
"href": "http://crest.regner.dev/characters/90000001/contacts/99000003/",
"contact": {
"id_str": "99000003",
"href": "http://crest.regner.dev/alliances/99000003/",
"name": "One One Corporation Alliance",
"id": 99000003
},
"contactType": "Alliance"
}
],
"pageCount": 1,
"pageCount_str": "1",
"totalCount": 3
}
请注意,items 数组可以包含任意数量的 "contacts"。
通过使用 http://json2csharp.com/,我在 C# 中将其转换为 类,如下所示:
public class Contacts
{
public string totalCount_str { get; set; }
public Item[] items { get; set; }
public int pageCount { get; set; }
public string pageCount_str { get; set; }
public int totalCount { get; set; }
}
public class Item
{
public int standing { get; set; }
public Alliance alliance { get; set; }
public string href { get; set; }
public Contact contact { get; set; }
public string contactType { get; set; }
public Character character { get; set; }
public bool watched { get; set; }
public bool blocked { get; set; }
}
public class Alliance
{
public string id_str { get; set; }
public string href { get; set; }
public int id { get; set; }
public string name { get; set; }
}
public class Contact
{
public string id_str { get; set; }
public string href { get; set; }
public string name { get; set; }
public int id { get; set; }
}
public class Character
{
public string name { get; set; }
public Corporation corporation { get; set; }
public bool isNPC { get; set; }
public string href { get; set; }
public Capsuleer capsuleer { get; set; }
public Portrait portrait { get; set; }
public int id { get; set; }
public string id_str { get; set; }
}
public class Corporation
{
public string name { get; set; }
public bool isNPC { get; set; }
public string href { get; set; }
public string id_str { get; set; }
public Logo logo { get; set; }
public int id { get; set; }
}
public class Logo
{
public _32X32 _32x32 { get; set; }
public _64X64 _64x64 { get; set; }
public _128X128 _128x128 { get; set; }
public _256X256 _256x256 { get; set; }
}
public class _32X32
{
public string href { get; set; }
}
public class _64X64
{
public string href { get; set; }
}
public class _128X128
{
public string href { get; set; }
}
public class _256X256
{
public string href { get; set; }
}
public class Capsuleer
{
public string href { get; set; }
}
public class Portrait
{
public _32X32 _32x32 { get; set; }
public _64X64 _64x64 { get; set; }
public _128X128 _128x128 { get; set; }
public _256X256 _256x256 { get; set; }
}
然后尝试反序列化:
List<Contacts> tempList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Contacts>>(response.Content);
感谢任何帮助我走上正轨的帮助。我目前在尝试这种方式时遇到错误:
Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[ContactWatchlister.Models.Contacts]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
Path 'totalCount_str', line 1, position 18.
我目前陷入困境,因为我不明白为什么它无法将 "totalCount_str" 理解为字符串。
我已经尝试在我的 类 中的所有属性上使用 [JsonProperty("attribute")]
来正确建模,但同样的错误。
我很确定我做的事情相当简单,但我做错了,但我无法理解它。希望你能帮忙! :-)
如果response.Content
包含你描述的JSON字符串我认为语句应该是:
var tempList = Newtonsoft.Json.JsonConvert.DeserializeObject<Contacts>(response.Content);
您的 JSON 在最外面 "level" 有 "totalCount_str"
、items
、pageCount
、pageCount_str
和 totalCount
字段],因此它只能反序列化为具有这些属性的 class(或具有与这些字段名相对应的正确 JsonAttribute
的属性)。
您试过的那个可以与以下 JSON 一起使用,其中最外层的实体是一个数组:
[ {
"totalCount_str": "3",
"items": [
{
"standing": 10,
"corporation": {
"name": "borkedLabs",
"isNPC": false,
"href": "https://crest-tq.eveonline.com/corporations/98046548/",
"id_str": "98046548",
"logo": {
"32x32": {
"href": "http://imageserver.eveonline.com/Corporation/98046548_32.png"
},
"64x64": {
"href": "http://imageserver.eveonline.com/Corporation/98046548_64.png"
},
"128x128": {
"href": "http://imageserver.eveonline.com/Corporation/98046548_128.png"
},
"256x256": {
"href": "http://imageserver.eveonline.com/Corporation/98046548_256.png"
}
},
"id": 98046548
},
"href": "https://crest-tq.eveonline.com/characters/94512721/contacts/98046548/",
"contact": {
"id_str": "98046548",
"href": "https://crest-tq.eveonline.com/corporations/98046548/",
"name": "borkedLabs",
"id": 98046548
},
"contactType": "Corporation"
},
{
"standing": 10,
"character": {
"name": "xxxx yyyy",
"corporation": {
"name": "xxyshs",
"isNPC": false,
"href": "https://crest-tq.eveonline.com/corporations/98401169/",
"id_str": "98401169",
"logo": {
"32x32": {
"href": "http://imageserver.eveonline.com/Corporation/98401169_32.png"
},
"64x64": {
"href": "http://imageserver.eveonline.com/Corporation/98401169_64.png"
},
"128x128": {
"href": "http://imageserver.eveonline.com/Corporation/98401169_128.png"
},
"256x256": {
"href": "http://imageserver.eveonline.com/Corporation/98401169_256.png"
}
},
"id": 98401169
},
"isNPC": false,
"href": "https://crest-tq.eveonline.com/characters/95161569/",
"capsuleer": {
"href": "https://crest-tq.eveonline.com/characters/95161569/capsuleer/"
},
"portrait": {
"32x32": {
"href": "http://imageserver.eveonline.com/Character/95161569_32.jpg"
},
"64x64": {
"href": "http://imageserver.eveonline.com/Character/95161569_64.jpg"
},
"128x128": {
"href": "http://imageserver.eveonline.com/Character/95161569_128.jpg"
},
"256x256": {
"href": "http://imageserver.eveonline.com/Character/95161569_256.jpg"
}
},
"id": 95161569,
"id_str": "95161569"
},
"contact": {
"id_str": "95161569",
"href": "https://crest-tq.eveonline.com/characters/95161569/",
"name": "xxxx yyyy",
"id": 95161569
},
"href": "https://crest-tq.eveonline.com/characters/94512769/contacts/95161569/",
"contactType": "Character",
"watched": false,
"blocked": false
},
{
"standing": -10,
"alliance": {
"id_str": "99000003",
"href": "http://crest.regner.dev/alliances/99000003/",
"id": 99000003,
"name": "One One Corporation Alliance"
},
"href": "http://crest.regner.dev/characters/90000001/contacts/99000003/",
"contact": {
"id_str": "99000003",
"href": "http://crest.regner.dev/alliances/99000003/",
"name": "One One Corporation Alliance",
"id": 99000003
},
"contactType": "Alliance"
}
],
"pageCount": 1,
"pageCount_str": "1",
"totalCount": 3 } ]