Laden...

Wie ein JSON von einer URL in C# Forms auslesen und verarbeiten?

Erstellt von blizzard vor 3 Jahren Letzter Beitrag vor 3 Jahren 2.634 Views
B
blizzard Themenstarter:in
33 Beiträge seit 2020
vor 3 Jahren
Wie ein JSON von einer URL in C# Forms auslesen und verarbeiten?

Hallo Forum 😃

Ich versuche von einer website Json datein auszulesen. [ Link zur Json ]

Jedoch bekomme ich probleme beim der deserialization.

Mein c# Code

[Form1]

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace JsonTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var client = new WebClient();
            string json = client.DownloadString("https://api.mylauncher.de/v4/api/post/read.php");
            News news = JsonConvert.DeserializeObject<News>(json);
            label1.Text = news.title;

        }
    }
}

[News Class]

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JsonTest
{
    public class News
    {
        [JsonProperty("id")]
        public string id { get; set; }
        [JsonProperty("title")]
        public string title { get; set; }
        [JsonProperty("body")]
        public string body { get; set; }
        [JsonProperty("author")]
        public string author { get; set; }
        [JsonProperty("category_id")]
        public string category_id { get; set; }
        [JsonProperty("category_name")]
        public string category_name { get; set; }
    }
}

Fehlermeldung:
Das aktuelle JSON-Array (z. B. [1,2,3]) kann nicht in den Typ 'JsonTest.news' deserialisiert werden, da für den Typ ein JSON-Objekt (z. B. {"name": "value"}) erforderlich ist, um die Deserialisierung korrekt durchzuführen.
Um diesen Fehler zu beheben, ändern Sie entweder den JSON in ein JSON-Objekt (z. B. {"name": "value"}) oder den deserialisierten Typ in ein Array oder einen Typ, der eine Auflistungsschnittstelle (z. B. ICollection, IList) wie List <T implementiert > das kann von einem JSON-Array deserialisiert werden. JsonArrayAttribute kann dem Typ auch hinzugefügt werden, um die Deserialisierung von einem JSON-Array zu erzwingen.
Pfad '', Zeile 1, Position 1.

[Das habe ich schon Versucht]

Ich habe bei google nach dem Fehler "Cannot deserialize the current JSON array" gesucht und einige Beispiele probiert jedoch bekomme ich immer wieder diesen Fehler.

Es steht ja eigentlich eindeutig dort das ich "Typ in ein Array deserialisierten" soll entweder bin ich einfach nur zu doof dafür oder habe jetzt ein paar stunden sinnlos nach einer Lösung gesucht.

Ich würde mich über Hilfe sehr freuen.

T
2.219 Beiträge seit 2008
vor 3 Jahren

Die Atribute brauchst du eigentlich nicht, die Namenskonvention entspricht ja den Eigenschaften.
Aber wie sie der Response aus?
Ich vermut aktuell, da du keine entsprechenden Header angibst, dass du kein Json bekommst.
Oder ist es sicher, dass dein Response nur json ist?

Bei einigen Apis muss man im Header nicht den erwarteten Response mitgeben.
Z.b. application/json oder text/json.

Am besten den Response einmal ausgeben und schauen ob auch das richtige Json zurück kommt.
Wenn du Json hast und der Fehler tritt auf, dann stimmt deine Klasse nicht bzw. bekommst du auch ein Json Array mit allen News, dann solltest du das in eine List<News> packen.

Nachtrag:
Ja, da kommt ein Json Array.
Entsprechend musst du die Zeile mit dem Deserialize<News> in Deserialize<List<News>> umbauen.
Dann sollte es passen 😃

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

P
5 Beiträge seit 2018
vor 3 Jahren

Hallo blizzard,

ändere einfach dein Code folgendermaßen um:



var news = JsonConvert.DeserializeObject<List<News>>(json);


Damit klappt es. 😃

Schönes WE.

P
441 Beiträge seit 2014
vor 3 Jahren

Der Vollständigkeit halber: WebClient ist veraltet, nutze den HttpClient.
Steht auch in der Dokumentation zum WebClient: https://docs.microsoft.com/en-us/dotnet/api/system.net.webclient?view=netcore-3.1

B
blizzard Themenstarter:in
33 Beiträge seit 2020
vor 3 Jahren

Hallo 😃

Danke für eure antworten ich bin leider erst jetzt dazu gekommen zurückzuschreiben.
Ich werde mich morgen mal ran setzen. 😃

B
blizzard Themenstarter:in
33 Beiträge seit 2020
vor 3 Jahren

Danke es hat super funktioniert 😃

        private void Form1_Load(object sender, EventArgs e)
        {
            var client = new WebClient();
            string json = client.DownloadString("https://api.mylauncher.de/v4/api/post/read.php");

            var news = JsonConvert.DeserializeObject<List<News>>(json);

            var id = news[0].id;
            var title = news[0].title;
            var body = news[0].body;


            label1.Text = id;
            label2.Text = title;
            label3.Text = body;

        }

PS: denn WebClient werde ich natürlich noch anpassen 😉