簡體   English   中英

使用json.net將json轉換為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數組可以包含任意數量的“聯系人”。

通過使用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在最外層“級別”中具有"totalCount_str"itemspageCountpageCount_strtotalCount字段,因此它只能被反序列化為具有這些屬性的類(或具有與這些字段名對應的正確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   } ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM