[c#] Deserialisieren von JSON zu .NET Objekt mit Newtonsoft (oder LINQ zu JSON vielleicht?)



Answers

Sie können den dynamic Typ C # verwenden, um die Vorgänge zu vereinfachen. Diese Technik macht auch das Re-Factoring einfacher, da es nicht auf Zauberzeichenfolgen beruht.

JSON

Die folgende JSON-Zeichenfolge ist eine einfache Antwort von einem HTTP-API-Aufruf und definiert zwei Eigenschaften: Id und Name .

{"Id": 1, "Name": "biofractal"}

C #

Verwenden Sie JsonConvert.DeserializeObject<dynamic>() um diese Zeichenfolge in einen dynamischen Typ zu deserialisieren, und greifen Sie dann einfach auf ihre Eigenschaften auf die übliche Weise zu.

dynamic results = JsonConvert.DeserializeObject<dynamic>(json);
var id = results.Id;
var name= results.Name;

Wenn Sie den Typ der results als dynamic angeben, werden die Eigenschaftswerte, statt das Schlüsselwort var , korrekt deserialisiert, z. B. Id zu einem int und nicht zu einem JValue (dank GFoley83 für den Kommentar unten).

Hinweis : Der NuGet-Link für die Newtonsoft-Assembly lautet http://nuget.org/packages/newtonsoft.json .

Question

Ich weiß, dass es ein paar Posts über Newtonsoft gibt, also hoffentlich ist das nicht genau eine Wiederholung ... Ich versuche, JSON-Daten, die von Kazaas API zurückgegeben werden, in ein nettes Objekt irgendeiner Art zu konvertieren

WebClient client = new WebClient();
Stream stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album");
StreamReader reader = new StreamReader(stream);

List<string> list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(reader.Read().ToString());

foreach (string item in list)
{
    Console.WriteLine(item);
}

//Console.WriteLine(reader.ReadLine());
stream.Close();

Diese JsonConvert-Linie ist nur die jüngste, die ich versuchte ... Ich verstehe es nicht ganz und hoffte, einige Fußarbeit zu beseitigen, indem ich euch fragte. Ich versuchte ursprünglich, es in ein Wörterbuch oder etwas zu konvertieren ... und tatsächlich, ich muss nur ein paar Werte darin einhaken, also nach der Dokumentation urteilend, könnte vielleicht Newtonsofts LINQ zu JSON eine bessere Wahl sein? Gedanken / Links?

Hier ist ein Beispiel für die JSON-Rückgabedaten:

{
  "page": 1,
  "total_pages": 8,
  "total_entries": 74,
  "q": "muse",
  "albums": [
    {
      "name": "Muse",
      "permalink": "Muse",
      "cover_image_url": "http://image.kazaa.com/images/69/01672812 1569/Yaron_Herman_Trio/Muse/Yaron_Herman_Trio-Muse_1.jpg",
      "id": 93098,
      "artist_name": "Yaron Herman Trio"
    },
    {
      "name": "Muse",
      "permalink": "Muse",
      "cover_image_url": "htt p://image.kazaa.com/images/54/888880301154/Candy_Lo/Muse/Candy_Lo-Muse_1.jpg",
      "i d": 102702,
      "artist_name": "\u76e7\u5de7\u97f3"
    },
    {
      "name": "Absolution",
      "permalink": " Absolution",
      "cover_image_url": "http://image.kazaa.com/images/65/093624873365/Mus e/Absolution/Muse-Absolution_1.jpg",
      "id": 48896,
      "artist_name": "Muse"
    },
    {
      "name": "Ab solution",
      "permalink": "Absolution-2",
      "cover_image_url": "http://image.kazaa.com/i mages/20/825646911820/Muse/Absolution/Muse-Absolution_1.jpg",
      "id": 118573,
      "artist _name": "Muse"
    },
    {
      "name": "Black Holes And Revelations",
      "permalink": "Black-Holes-An d-Revelations",
      "cover_image_url": "http://image.kazaa.com/images/66/093624428466/ Muse/Black_Holes_And_Revelations/Muse-Black_Holes_And_Revelations_1.jpg",
      "id": 48813,
      "artist_name": "Muse"
    },
    {
      "name": "Black Holes And Revelations",
      "permalink": "Bla ck-Holes-And-Revelations-2",
      "cover_image_url": "http://image.kazaa.com/images/86/ 825646911486/Muse/Black_Holes_And_Revelations/Muse-Black_Holes_And_Revelations_1 .jpg",
      "id": 118543,
      "artist_name": "Muse"
    },
    {
      "name": "Origin Of Symmetry",
      "permalink": "Origin-Of-Symmetry",
      "cover_image_url": "http://image.kazaa.com/images/29/825646 912629/Muse/Origin_Of_Symmetry/Muse-Origin_Of_Symmetry_1.jpg",
      "id": 120491,
      "artis t_name": "Muse"
    },
    {
      "name": "Showbiz",
      "permalink": "Showbiz",
      "cover_image_url": "http: //image.kazaa.com/images/68/825646182268/Muse/Showbiz/Muse-Showbiz_1.jpg",
      "id": 60444,
      "artist_name": "Muse"
    },
    {
      "name": "Showbiz",
      "permalink": "Showbiz-2",
      "cover_imag e_url": "http://image.kazaa.com/images/50/825646912650/Muse/Showbiz/Muse-Showbiz_ 1.jpg",
      "id": 118545,
      "artist_name": "Muse"
    },
    {
      "name": "The Resistance",
      "permalink": "T he-Resistance",
      "cover_image_url": "http://image.kazaa.com/images/36/825646864836/ Muse/The_Resistance/Muse-The_Resistance_1.jpg",
      "id": 121171,
      "artist_name": "Muse"
    }
  ],
  "per_page": 10
}

Ich habe etwas mehr gelesen und festgestellt, dass Newtonsoft LINQ zu JSON genau das ist, was ich wollte ... mit WebClient, Stream, StreamReader und Newtonsoft ... Ich kann Kazaa für JSON-Daten treffen, eine URL extrahieren, die Datei herunterladen und tun alles in sieben Zeilen Code! Ich liebe es.

WebClient client = new WebClient();
Stream stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album");
StreamReader reader = new StreamReader(stream);

Newtonsoft.Json.Linq.JObject jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine());

// Instead of WriteLine, 2 or 3 lines of code here using WebClient to download the file
Console.WriteLine((string)jObject["albums"][0]["cover_image_url"]);
stream.Close();

Dieser Post bekommt so viele Treffer, dass ich dachte, dass es hilfreich sein könnte, die "using" -Bits einzubinden, die in den Kommentaren besprochen werden.

using(var client = new WebClient())
using(var stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album"))
using (var reader = new StreamReader(stream))
{
    var jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine());
    Console.WriteLine((string) jObject["albums"][0]["cover_image_url"]);
}



Wenn Sie wie ich mit stark typisierten Objekten arbeiten möchten, gehen Sie mit:

MyObj obj =  JsonConvert.DeserializeObject<MyObj>(jsonString);

Auf diese Art und Weise können Sie intellisense und die Art der Fehlerprüfung beim Kompilieren verwenden.

Sie können die benötigten Objekte einfach erstellen, indem Sie Ihren JSON in den Speicher kopieren und ihn als JSON-Objekte einfügen (Visual Studio -> Bearbeiten -> Inhalte einfügen -> JSON als Klassen einfügen).

Sehen Sie here wenn Sie diese Option in Visual Studio nicht haben.

Sie müssen auch sicherstellen, dass Ihr JSON gültig ist. Fügen Sie am Anfang ein eigenes Objekt hinzu, wenn es sich nur um ein Array von Objekten handelt. zB { "obj": [{}, {}, {}]}

** Ich weiß, dass Dynamik manchmal die Dinge einfacher macht, aber ich bin ein bisschen olskool mit diesem.




Wenn Sie nur nach einem bestimmten Wert suchen, der im JSON-Inhalt verschachtelt ist, können Sie so etwas tun:

yourJObject.GetValue("jsonObjectName").Value<string>("jsonPropertyName");

Und so weiter von dort.

Dies kann hilfreich sein, wenn Sie nicht die Kosten für die Konvertierung des gesamten JSON in ein C # -Objekt übernehmen möchten.




Korrigiere mich, wenn ich mich irre, aber das vorherige Beispiel, glaube ich, ist nur wenig synchron mit der neuesten Version von James Newtons Json.NET-Bibliothek.

var o = JObject.Parse(stringFullOfJson);
var page = (int)o["page"];
var totalPages = (int)o["total_pages"];





Links