簡體   English   中英

JsonSerializationException:無法反序列化當前的 JSON 對象

[英]JsonSerializationException: Cannot deserialize the current JSON object

我對 C# 和 Visualstudio2017 非常陌生,並且已經堅持了幾個星期。 搜索網絡,但沒有找到與此相關的我可以正確理解的結果。 我想要做的是從https://zkillboard.com/api/stats/characterID/224802743/獲取 json 數據,然后將其轉換為可用數據,我可以獲取並在某些文本框中顯示某些數據。 我使用https://quicktype.io/將 json 轉換為 C# 數組。

主窗體

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Net;
using ZKILLBOARDDATA;



namespace MainProgram
{

    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
            this.DoubleBuffered = true;
            this.SetStyle(ControlStyles.ResizeRedraw, true);

        }


        public async void Btn_submit_ClickAsync(object sender, EventArgs e)
        {
             var remoteUri = "https://zkillboard.com/api/stats/characterID/224802743/";
             var myWebClient = new WebClient();
             myWebClient.Headers.Add("user-agent", "C# App testing");
             var jsonString = await myWebClient.DownloadStringTaskAsync(remoteUri);
             var data = GettingStarted.FromJson(jsonString);
        }   
    }
}

Zkill.cs

using Newtonsoft.Json;
// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do:
//
//    using ZKILLBOARDDATA;
//
//    var data = GettingStarted.FromJson(jsonString);
//
namespace ZKILLBOARDDATA
{

    public partial class GettingStarted
    {
        [JsonProperty("attackers")]
        public Attacker[] Attackers { get; set; }

        [JsonProperty("killmail_id")]
        public long KillmailId { get; set; }

        [JsonProperty("killmail_time")]
        public string KillmailTime { get; set; }

        [JsonProperty("moon_id")]
        public long? MoonId { get; set; }

        [JsonProperty("solar_system_id")]
        public long SolarSystemId { get; set; }

        [JsonProperty("victim")]
        public Victim Victim { get; set; }

        [JsonProperty("war_id")]
        public long? WarId { get; set; }

        [JsonProperty("zkb")]
        public Zkb Zkb { get; set; }
    }

    public partial class Zkb
    {
        [JsonProperty("awox")]
        public bool Awox { get; set; }

        [JsonProperty("fittedValue")]
        public double FittedValue { get; set; }

        [JsonProperty("hash")]
        public string Hash { get; set; }

        [JsonProperty("locationID")]
        public long LocationID { get; set; }

        [JsonProperty("npc")]
        public bool Npc { get; set; }

        [JsonProperty("points")]
        public long Points { get; set; }

        [JsonProperty("solo")]
        public bool Solo { get; set; }

        [JsonProperty("totalValue")]
        public double TotalValue { get; set; }
    }

    public partial class Victim
    {
        [JsonProperty("alliance_id")]
        public long? AllianceId { get; set; }

        [JsonProperty("character_id")]
        public long? CharacterId { get; set; }

        [JsonProperty("corporation_id")]
        public long CorporationId { get; set; }

        [JsonProperty("damage_taken")]
        public long DamageTaken { get; set; }

        [JsonProperty("items")]
        public Item[] Items { get; set; }

        [JsonProperty("position")]
        public Position Position { get; set; }

        [JsonProperty("ship_type_id")]
        public long ShipTypeId { get; set; }
    }

    public partial class Position
    {
        [JsonProperty("x")]
        public double X { get; set; }

        [JsonProperty("y")]
        public double Y { get; set; }

        [JsonProperty("z")]
        public double Z { get; set; }
    }

    public partial class Item
    {
        [JsonProperty("flag")]
        public long Flag { get; set; }

        [JsonProperty("item_type_id")]
        public long ItemTypeId { get; set; }

        [JsonProperty("items")]
        public Item[] Items { get; set; }

        [JsonProperty("quantity_destroyed")]
        public long? QuantityDestroyed { get; set; }

        [JsonProperty("quantity_dropped")]
        public long? QuantityDropped { get; set; }

        [JsonProperty("singleton")]
        public long Singleton { get; set; }
    }

    public partial class Attacker
    {
        [JsonProperty("alliance_id")]
        public long? AllianceId { get; set; }

        [JsonProperty("character_id")]
        public long? CharacterId { get; set; }

        [JsonProperty("corporation_id")]
        public long? CorporationId { get; set; }

        [JsonProperty("damage_done")]
        public long DamageDone { get; set; }

        [JsonProperty("faction_id")]
        public long? FactionId { get; set; }

        [JsonProperty("final_blow")]
        public bool FinalBlow { get; set; }

        [JsonProperty("security_status")]
        public double SecurityStatus { get; set; }

        [JsonProperty("ship_type_id")]
        public long? ShipTypeId { get; set; }

        [JsonProperty("weapon_type_id")]
        public long? WeaponTypeId { get; set; }
    }

    public partial class GettingStarted
    {
        public static GettingStarted[] FromJson(string json) => JsonConvert.DeserializeObject<GettingStarted[]>(json, Converter.Settings);
    }

    public static class Serialize
    {
        public static string ToJson(this GettingStarted[] self) => JsonConvert.SerializeObject(self, Converter.Settings);
    }

    public class Converter
    {
        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
        };
    }
}

這是我從 VS2017 收到的錯誤消息。

JsonSerializationException:無法將當前 JSON 對象(例如 {"name":"value"})反序列化為類型“ZKILLBOARDDATA.GettingStarted[]”,因為該類型需要 JSON 數組(例如 [1,2,3])才能正確反序列化。

要修復此錯誤,請將 JSON 更改為 JSON 數組(例如 [1,2,3])或更改反序列化類型,使其成為普通的 .NET 類型(例如,不是像整數這樣的原始類型,而不是像這樣的集合類型)可以從 JSON 對象反序列化的數組或列表)。 JsonObjectAttribute 也可以添加到類型中以強制它從 JSON 對象反序列化。

路徑“allTimeSum”,第 1 行,位置 14。

嘗試這個

     var remoteUri = "https://zkillboard.com/api/stats/characterID/224802743/";
     var myWebClient = new WebClient();
     myWebClient.Headers.Add("user-agent", "C# App testing");
     myWebClient.Headers.Add("content-type", "application/json");

     var jsonString = myWebClient.DownloadStringTaskAsync(remoteUri).Result;

     var obj = JsonConvert.DeserializeObject(jsonString);
     //OR
     var obj = JsonConvert.DeserializeObject<YourModel>(jsonString);

我認為你的模型中不需要這個

public partial class GettingStarted
    {
        public static GettingStarted[] FromJson(string json) => JsonConvert.DeserializeObject<GettingStarted[]>(json, Converter.Settings);
    }

    public static class Serialize
    {
        public static string ToJson(this GettingStarted[] self) => JsonConvert.SerializeObject(self, Converter.Settings);
    }

    public class Converter
    {
        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
        };
    }

我有同樣的問題; 我通過使用新的默認System.Text.Json.JsonSerializer.Deserialize而不是Newtonsoft解決了它

using System.Text.Json;    
var obj = JsonSerializer.Deserialize<YourMODEL>(jsonStr);

ps https://quicktype.io很棒(雖然對於 C# 來說似乎有些過時); 我也試過http://json2csharp.com但我的 json 文件很大而且它凍結了。

有時(特別是對於深度嵌套的復雜 json)quicktype 不添加列表/數組類型; 例如MyObj而不是List<MyObj> 有時可以通過先選擇 T[] 然后從網站的生成菜單選項Use T[] or List<T>來“修復”它。

暫無
暫無

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

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