简体   繁体   English

JsonSerializationException:无法反序列化当前的 JSON 对象

[英]JsonSerializationException: Cannot deserialize the current JSON object

i am very new to C# and Visualstudio2017 and have been stuck on this for literally weeks.我对 C# 和 Visualstudio2017 非常陌生,并且已经坚持了几个星期。 Searching the net but not finding results relating to this that i can understand properly.搜索网络,但没有找到与此相关的我可以正确理解的结果。 What i am trying to do is get json data from https://zkillboard.com/api/stats/characterID/224802743/ then convert it into usable data that i can get and display certain data in certain textboxes.我想要做的是从https://zkillboard.com/api/stats/characterID/224802743/获取 json 数据,然后将其转换为可用数据,我可以获取并在某些文本框中显示某些数据。 I used https://quicktype.io/ to convert the json into C# array.我使用https://quicktype.io/将 json 转换为 C# 数组。

MainForm.cs主窗体

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 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,
        };
    }
}

Here is the error message i am getting from VS2017.这是我从 VS2017 收到的错误消息。

JsonSerializationException: Cannot deserialize the current JSON object (eg {"name":"value"}) into type 'ZKILLBOARDDATA.GettingStarted[]' because the type requires a JSON array (eg [1,2,3]) to deserialize correctly. JsonSerializationException:无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型“ZKILLBOARDDATA.GettingStarted[]”,因为该类型需要 JSON 数组(例如 [1,2,3])才能正确反序列化。

To fix this error either change the JSON to a JSON array (eg [1,2,3]) or change the deserialized type so that it is a normal .NET type (eg not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object.要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其成为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是像这样的集合类型)可以从 JSON 对象反序列化的数组或列表)。 JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object. JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。

Path 'allTimeSum', line 1, position 14.路径“allTimeSum”,第 1 行,位置 14。

Try this尝试这个

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

I don't think you need this in your model我认为你的模型中不需要这个

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,
        };
    }

I had the same problem;我有同样的问题; I solved it by using the new default System.Text.Json.JsonSerializer.Deserialize instead of the Newtonsoft 's我通过使用新的默认System.Text.Json.JsonSerializer.Deserialize而不是Newtonsoft解决了它

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

ps https://quicktype.io is great (although seems somewhat outdated for C#); ps https://quicktype.io很棒(虽然对于 C# 来说似乎有些过时); I've also tried http://json2csharp.com but my json file is big and it froze up.我也试过http://json2csharp.com但我的 json 文件很大而且它冻结了。

Also sometimes (in particularly for deeply nested complex json) quicktype doesn't add the list/array type;有时(特别是对于深度嵌套的复杂 json)quicktype 不添加列表/数组类型; eg MyObj instead of List<MyObj> .例如MyObj而不是List<MyObj> Sometimes it is possible to "fix" it by picking T[] first and then List from the website's generation menu option Use T[] or List<T> .有时可以通过先选择 T[] 然后从网站的生成菜单选项Use T[] or List<T>来“修复”它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Newtonsoft.Json.JsonSerializationException:&#39;无法反序列化当前JSON对象 - Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON object Newtonsoft.Json.JsonSerializationException:无法反序列化当前的JSON对象 - Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON object Json.JsonSerializationException:无法反序列化当前 JSON 对象 - Json.JsonSerializationException : Cannot deserialize the current JSON object C# JsonSerializationException 无法反序列化当前 JSON 对象 - C# JsonSerializationException Cannot deserialize the current JSON object 如何修复错误:JsonSerializationException:无法反序列化当前 JSON object - How to fix error: JsonSerializationException: Cannot deserialize the current JSON object Newtonsoft.Json.JsonSerializationException: '无法反序列化当前的 JSON object (例如 {"name":"value"}) - Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON object (e.g. {"name":"value"}) Newtonsoft.Json.JsonSerializationException: &#39;无法反序列化当前的 JSON 数组 - Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON array JsonSerializationException:无法将当前 JSON object(例如 {"name":"value"})反序列化为类型 'System.Collections。 - JsonSerializationException: Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List 无法反序列化当前JSON对象 - Cannot deserialize the current JSON object 无法反序列化当前的JSON对象 - Cannot deserialize the current JSON object
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM