2017-02-16 2 views
3

WordPressでテストサイトからの投稿を取得したいと思います。私がデバッグしているとき、私はWebからデータを取得することができますが、TextBoxに配置しようとすると、存在しないように見えます。私はWebサイトを使ってC#のクラスを作成しましたが、問題は自分のコードにあると思います。私はこのようなメソッドを呼び出す:C#jsonから変換する際の問題

RootObject myPosts = await Class1.Get(); 

その後、ユーザーへの値を表示するために、私は:

textBox1.Text = myPosts.id + " - " + myPosts.author+ "-" + myPosts.title; 

はコード:

public class Class1 
{ 
    public async static Task<RootObject> Get() 
    { 
     var http = new HttpClient(); 
     var response = await http.GetAsync("http://bearlike-attackers.000webhostapp.com/wp-json/wp/v2/posts?search=TEST"); 
     var result = await response.Content.ReadAsStringAsync(); 
     var serializer = new DataContractJsonSerializer(typeof(RootObject)); 

     var ms = new MemoryStream(Encoding.UTF8.GetBytes(result)); 
     var data = (RootObject)serializer.ReadObject(ms); 
     return data; 
    } 
} 
    [DataContract] 
    public class Guid 
    { 
     [DataMember] 
     public string rendered { get; set; } 
    } 
    [DataContract] 
    public class Title 
    { 
     [DataMember] 
     public string title { get; set; } 
    } 
    [DataContract] 
    public class Content 
    { 
     [DataMember] 
     public string rendered { get; set; } 

     [DataMember] 
     public bool @protected { get; set; } 
    } 
    [DataContract] 
    public class Excerpt 
    { 
     [DataMember] 
     public string rendered { get; set; } 

     [DataMember] 
     public bool @protected { get; set; } 
    } 
    [DataContract] 
    public class Self 
    { 
     [DataMember] 
     public string href { get; set; } 
    } 
    [DataContract] 
    public class Collection 
    { 
     [DataMember] 
     public string href { get; set; } 
    } 
    [DataContract] 
    public class About 
    { 
     [DataMember] 
     public string href { get; set; } 
    } 
    [DataContract] 
    public class Author 
    { 
     [DataMember] 
     public bool embeddable { get; set; } 

     [DataMember] 
     public string href { get; set; } 
    } 
    [DataContract] 
    public class Reply 
    { 
     [DataMember] 
     public bool embeddable { get; set; } 

     [DataMember] 
     public string href { get; set; } 
    } 
    [DataContract] 
    public class VersionHistory 
    { 
     [DataMember] 
     public string href { get; set; } 
    } 
    [DataContract] 
    public class WpAttachment 
    { 
     [DataMember] 
     public string href { get; set; } 
    } 
    [DataContract] 
    public class WpTerm 
    { 
     [DataMember] 
     public string taxonomy { get; set; } 

     [DataMember] 
     public bool embeddable { get; set; } 

     [DataMember] 
     public string href { get; set; } 
    } 
    [DataContract] 
    public class Cury 
    { 
     [DataMember] 
     public string name { get; set; } 

     [DataMember] 
     public string href { get; set; } 

     [DataMember] 
     public bool templated { get; set; } 
    } 
    /* 
    public class Links 
    { 
     public List<Self> self { get; set; } 
     public List<Collection> collection { get; set; } 
     public List<About> about { get; set; } 
     public List<Author> author { get; set; } 
     public List<Reply> replies { get; set; } 
     public List<VersionHistory> __invalid_name__version-history { get; set; } 
    public List<WpAttachment> __invalid_name__wp:attachment { get; set; } 
public List<WpTerm> __invalid_name__wp:term { get; set; } 
    public List<Cury> curies { get; set; } 
} 
*/ 
    [DataContract] 
    public class RootObject 
    { 
     [DataMember] 
     public string date { get; set; } 

     [DataMember] 
     public int id { get; set; } 

     [DataMember] 
     public string date_gmt { get; set; } 

     [DataMember] 
     public Guid guid { get; set; } 

     [DataMember] 
     public string modified { get; set; } 

     [DataMember] 
     public string modified_gmt { get; set; } 

     [DataMember] 
     public string slug { get; set; } 

     [DataMember] 
     public string type { get; set; } 

     [DataMember] 
     public string link { get; set; } 

     [DataMember] 
     public Title title { get; set; } 

     [DataMember] 
     public Content content { get; set; } 

     [DataMember] 
     public Excerpt excerpt { get; set; } 

     [DataMember] 
     public int author { get; set; } 

     [DataMember] 
     public int featured_media { get; set; } 

     [DataMember] 
     public string comment_status { get; set; } 

     [DataMember] 
     public string ping_status { get; set; } 

     [DataMember] 
     public bool sticky { get; set; } 

     [DataMember] 
     public string template { get; set; } 

     [DataMember] 
     public string format { get; set; } 
     /* 
      [DataMember] 
      public List<object> meta { get; set; } 

      [DataMember] 
      public List<int> categories { get; set; } 

      [DataMember] 
      public List<object> tags { get; set; } 


      [DataMember] 
      public Links _links { get; set; } 
      */ 
    } 

} 
+1

_「テキストボックスに入れようとすると、存在しないようです」_表示する場所にコードを表示できますか? – stuartd

+0

textBox1.Text = myPosts.id + " - " + myPosts.author + " - " + myPosts.title; –

答えて

0

あなたがあなたのURLを貼り付けた場合http://jsonlint.com/の場合、フォーマットされたJSONは次のようになります。

[{ 
    "id": 4, 
    "date": "2017-02-16T14:28:41", 
    "date_gmt": "2017-02-16T13:28:41", 
    "guid": { 
     "rendered": "https:\/\/bearlike-attackers.000webhostapp.com\/?p=4" 
    }, 
    "modified": "2017-02-16T14:28:41", 
    "modified_gmt": "2017-02-16T13:28:41", 
    "slug": "testy", 
    "type": "post", 
    "link": "https:\/\/bearlike-attackers.000webhostapp.com\/2017\/02\/16\/testy\/", 
    "title": { 
     "rendered": "Testy" 
    }, 
// And many other properties. 

}] 

外側はと]です。問題は、外側のJSONコンテナがオブジェクトではなく配列であることです。 JSON standardで説明されているように:

  • 配列は順序付けされた値の集合です。配列は[(左括弧)で始まり、末尾に](右括弧)で終わります。値は,(カンマ)で区切られます。

  • オブジェクトは、名前と値のペアの順序付けられていないセットです。オブジェクトは{(左括弧)で始まり、}(右中括弧)で終わります。

DataContractJsonSerializerようList<T>T []として純コレクション型からとにJSON配列をシリアル化します。次のようにこのようにあなたはデシリアライズする必要があります。

public async static Task<List<RootObject>> Get() 
{ 
    var http = new HttpClient(); 
    var response = await http.GetAsync("http://bearlike-attackers.000webhostapp.com/wp-json/wp/v2/posts?search=TEST"); 
    var result = await response.Content.ReadAsStringAsync(); 

    var serializer = new DataContractJsonSerializer(typeof(List<RootObject>)); 
    var ms = new MemoryStream(Encoding.UTF8.GetBytes(result)); 
    var list = (List<RootObject>)serializer.ReadObject(ms); 
    return list; 
} 

を、あなたのサービスが一つだけのアイテムを返すと確信していた場合、あなたはEnumerable.SingleOrDefault()を使用して、単一のRootObjectを返すことができます。

return list.SingleOrDefault(); 

それは私には少し驚くべきことですそのような場合にはDataContractJsonSerializerは何もしません。この場合、Unexpected token: StartArrayの例外をスローします。

最後に、タイトルに使用されるプロパティ名は"rendered"ではなく、"title"です。このように、あなたのTitleクラスが見えるように必要があります:

[DataContract] 
public class Title 
{ 
    [DataMember] 
    public string rendered { get; set; } 
} 

、その値にアクセスするには、(必要に応じていずれかのヌルチェックを追加)します:

var s = myPost.id + " - " + myPost.author + "-" + myPost.title.rendered; 

(私はあなたの他のデータの正確性をチェックしていません

+0

私は完全に見落とされました。それを指摘してくれてありがとう。私は、RootObject myPosts = Class1を待たなければならないと思う。取得する();リストへ myPosts = Class1.Get();を待ちます。 。 –

関連する問題