2016-08-16 2 views
2

OpenLibrary.orgの書籍データベースに照会していますが、ISBNで書籍をリクエストすると、その結果にデータ構造の最も外側の部分としてISBN IDが含まれています。JSONレスポンスの最も外側のレベルを無視するにはどうすればよいですか?

{ "ISBN:0192821474":{"実際に気にするもの"} }

途中で取得するラッパークラスを生成すると、ラッパークラスがISBN0192821474という名前になっているので、複雑です。私はそのために "Xamasoft JSON Class Generator"を使用しています。

私ができる必要があるのは、一番外側の要素を「スキップ」して、それを自分の応答の実際の内容として取得することです。

これを行うにはどうすればよいですか?私はNewtonsoft.JsonとRestSharpを持っていて、どうにかして構造体をあるレベル深く「歩いて」そこから作業したいと思っています。

例えば、response.Contentが子ノードのコンテンツであれば、次のコードでうまく動作します。

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

私はそれを解析するための正規表現を書くことができ確信しているが、はっきりそれはそれを行うには「正しい」方法はありませんので、私はいくつかのガイダンスを必要としています。

+2

ここ

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

はデモですいくつかのドキュメントですNewtonsoft(http://www.newtonsoft.com/json/help/html/SerializingJSONFragments.htm)からの提案は、それを行う方法の明確な例を示しています:P – starlight54

答えて

0

はい、これはJson.NetのLINQ-to-JSON API(JObjects)を使用すると簡単に実行できます。

私はこのような小さな再利用可能なヘルパーメソッドになるだろう:

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

出力:

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

フィドル:ここhttps://dotnetfiddle.net/LGiztM

関連する問題