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"itemspageCountpageCount_strtotalCount 字段],因此它只能反序列化为具有这些属性的 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   } ]