2017-02-16 80 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(); 。 –