2016-08-16 1 views
2

ich die OpenLibrary.org Buch-Datenbank abfragt, aber eine Marotte davon ist, dass, wenn Sie ein Buch von ISBN verlangen die Ergebnisse die ISBN-ID als äußersten Teil der Datenstruktur umfassen, etwa so:Wie kann ich die äußerste Stufe einer JSON-Antwort ignorieren?

{ "ISBN: 0192821474": {"stuff Ich interessiere mich wirklich"} }

Wenn ich eine Wrapper-Klasse generieren, die in die Quere kommt; Es ist auch deshalb kompliziert, weil die Wrapper-Klasse den Namen ISBN0192821474 hat. Ich benutze dafür den "Xamasoft JSON Class Generator".

Was ich tun muss, ist das äußerste Element zu "überspringen" und seinen Text als den eigentlichen Inhalt meiner Antwort zu bekommen.

Was ist der beste Weg, das zu tun? Ich habe Newtonsoft.Json und RestSharp und hoffe, dass ich die Struktur irgendwie eine Stufe tiefer "laufen" und von dort aus arbeiten kann.

Im folgenden Code würde es beispielsweise gut funktionieren, wenn response.Content der Inhalt des untergeordneten Knotens wäre.

 var client = new RestClient("http://openlibrary.org"); 
     var request = new RestRequest("/api/books?bibkeys=ISBN:0192821474&jscmd=data&format=json", Method.GET); 
     IRestResponse response = client.Execute(request); 
     var content = response.Content; // raw content as string 
     var x = JsonConvert.DeserializeObject<Example.OpenLibrary>(response.Content); 

Ich bin sicher, dass ich einen regulären Ausdruck, es zu analysieren schreiben könnte, aber das ist eindeutig nicht der „richtige“ Weg, es zu tun, so brauche ich einige Hinweise.

+2

Hier ist ein Dokument Ein Beispiel aus Newtonsoft (http://www.newtonsoft.com/json/help/html/SerializingJSONFragments.htm) zeigt ein klares Beispiel dafür, wie man es macht: P – starlight54

Antwort

0

Ja, Sie können dies einfach mit Json.Net's LINQ-to-JSON API (JObjects) tun.

Ich würde ein wenig wiederverwendbare Hilfsmethode wie diese machen:

public static T DeserializeAndUnwrap<T>(string json) 
{ 
    JObject jo = JObject.Parse(json); 
    return jo.Properties().First().Value.ToObject<T>(); 
} 

Hier ist eine Demo:

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var client = new RestClient("http://openlibrary.org"); 
     var request = new RestRequest("/api/books?bibkeys=ISBN:0192821474&jscmd=data&format=json", Method.GET); 
     IRestResponse response = client.Execute(request); 
     var content = response.Content; // raw content as string 

     Book book = DeserializeAndUnwrap<Book>(content); 
     Console.WriteLine(book.title); 
     if (book.authors.Any()) Console.WriteLine("By " + book.authors.First().name); 
     Console.WriteLine(book.number_of_pages + " pages"); 
     Console.WriteLine("Published " + book.publish_date); 
    } 

    public static T DeserializeAndUnwrap<T>(string json) 
    { 
     JObject jo = JObject.Parse(json); 
     return jo.Properties().First().Value.ToObject<T>(); 
    } 
} 

public class Book 
{ 
    public Publisher[] publishers { get; set; } 
    public string pagination { get; set; } 
    public Identifiers identifiers { get; set; } 
    public Classifications classifications { get; set; } 
    public string title { get; set; } 
    public string url { get; set; } 
    public string notes { get; set; } 
    public int number_of_pages { get; set; } 
    public Subject[] subjects { get; set; } 
    public string publish_date { get; set; } 
    public string key { get; set; } 
    public Author[] authors { get; set; } 
    public string by_statement { get; set; } 
    public Publish_Places[] publish_places { get; set; } 
} 

public class Identifiers 
{ 
    public string[] lccn { get; set; } 
    public string[] openlibrary { get; set; } 
    public string[] isbn_10 { get; set; } 
    public string[] oclc { get; set; } 
    public string[] librarything { get; set; } 
    public string[] goodreads { get; set; } 
} 

public class Classifications 
{ 
    public string[] dewey_decimal_class { get; set; } 
} 

public class Publisher 
{ 
    public string name { get; set; } 
} 

public class Subject 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Author 
{ 
    public string url { get; set; } 
    public string name { get; set; } 
} 

public class Publish_Places 
{ 
    public string name { get; set; } 
} 

Ausgang:

The anthropic cosmological principle 
By John D. Barrow 
706 pages 
Published 1996 

Fiddle: https://dotnetfiddle.net/LGiztM

Verwandte Themen