2017-02-16 167 views
3

我想從WordPress的測試網站獲得帖子。當我調試時,我可以看到我從網上獲取數據,但是當我嘗試將它們放入文本框時,它們似乎不存在。我使用了一個網站來創建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

如果粘貼您的網址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從和到.NET集合類型如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; } 
} 

並訪問它的價值,做(添加任何null檢查的要求):

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

(我沒有檢查你的其他數據的正確性你應該,因爲一個是不正確的。)

+0

我完全忽略了[],謝謝你指出。我想我必須改變RootObject myPosts =等待Class1。得到();到列表 myPosts = await Class1.Get(); 。 –