2011-07-19 84 views
2

我是使用JSON的新手,我正努力在列表中返回一个列表。我得到以下JSON:Json返回列表中的列表

{ 
    "parameters": { 
     "tbdb": "trudon", 
     "min_prefix_length": "2", 
     "service": "prefix", 
     "template": "service.json", 
     "term_prefix": "plu"}, 
    "termHints": [ 
     { 
      "name": "Plumbers & Sanitary Engineers", 
      "id":"209654", 
      "values": { 
       "value":"Plumbers & Sanitary Engineers", 
       "pre_em":"", 
       "em":"Plu", 
       "post_em":"mbers & Sanitary Engineers", 
       "nature":"PT", 
       "id":"209654" 
      } 
     }, 
    ], 
    "facets": [ 
     { 
      "id":"209654", 
      "name":"Plumbers & Sanitary Engineers" 
     } 
    ], 
    "total":1 
} 

我已经使用了JSON DataContractJsonSerializer desrialized这一点,它看起来像下面这样:

编辑:取得由carlosfigueira这里

被建议修改
[DataContract] 
    public class AutoCompleteResponse 
    { 
     [DataMember(Name = "parameters")] 
     public Parameter Parameters { get; set; } 
     [DataMember(Name = "termHints")] 
     public List<termHints> hints { get; set; } 
     [DataMember(Name = "total")] 
     public string Total { get; set; } 
    } 
    [DataContract] 
    public class Parameter 
    { 
     [DataMember(Name = "tbdb")] 
     public string tbdb { get; set; } 
     [DataMember(Name = "min_prefix_length")] 
     public string min_prefix_length { get; set; } 
     [DataMember(Name = "service")] 
     public string service { get; set; } 
     [DataMember(Name = "template")] 
     public string template { get; set; } 
     [DataMember(Name = "term_prefix")] 
     public string term_prefrix { get; set; } 
    } 
    [DataContract] 
    public class termHints 
    { 
     [DataMember(Name = "name")] 
     public string Name { get; set; } 
     [DataMember(Name = "id")] 
     public string id { get; set; } 
     [DataMember(Name = "values")] 
     public values Values { get; set; } 
     [DataMember(Name = "facets")] 
     public facets Facets { get; set; } 

    } 
    [DataContract] 
    public class values 
    { 
     [DataMember(Name = "value")] 
     public string value_name { get; set; } 
     [DataMember(Name = "pre_em")] 
     public string pre_em { get; set; } 
     [DataMember(Name = "em")] 
     public string em { get; set; } 
     [DataMember(Name = "post_em")] 
     public string post_em { get; set; } 
     [DataMember(Name = "nature")] 
     public string nature { get; set; } 
     [DataMember(Name = "id")] 
     public string value_id { get; set; } 
    } 
    [DataContract] 
    public class facets 
    { 
     [DataMember(Name = "id")] 
     public string facet_id { get; set; } 
     [DataMember (Name = "name")] 
     public string facet_name {get; set; } 
    } 

序列号我看起来像下面这样:

WebClient w = new WebClient(); 
    w.DownloadStringCompleted += (a, b) => 
    { 
     // Check for errors 
     if (b == null) { return; } 
     if (b.Error != null) { return; } 
     if (string.IsNullOrEmpty(b.Result)) { return; } 

     // Desearealize from JSON to .NET objects 
     Byte[] bytes = Encoding.Unicode.GetBytes(b.Result); 
     MemoryStream memoryStream = new MemoryStream(bytes); 
     DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeof(AutoCompleteResponse)); 
     AutoCompleteResponse autocompleteSearchResponse = dataContractJsonSerializer.ReadObject(memoryStream) as AutoCompleteResponse; 
     memoryStream.Close(); 

     // Raise Event 
     this.OnSearchCompleted(
      new WhatEventArgs() 
      { 
       response = autocompleteSearchResponse 
      } 
     ); 
    }; 
    w.DownloadStringAsync(builder.Uri); 

我创建的回报如下所示:

public class WhatEventArgs : EventArgs 
    { 
     public AutoCompleteResponse response { get; set; } 
    } 

*编辑:将用来在这里得到的数据柜面这是有帮助的代码......这是怎么我得到的数据从价值观,也许是我做错了什么,但我没有得到任何数据(它为空),我不知道我做错了*

protected void cmdSearch_Click(object sender, EventArgs e) 
    { 
     AutocompleteWhat search = new AutocompleteWhat() 
     { 
      Num = 2 
     }; 
     search.SearchCompleted += (a, b) => 
     { 
      List<values> _value = new List<values>(); 
      foreach (termHints item in b.response.hints) 
      { 
       _value.Add(item.Values); 
      } 
      if (_value.Count > 0) 
      { 
       dgvResults.DataSource = _value; 
      } 
      else 
      { 
       dgvResults.DataSource = null; 
      } 
      dgvResults.DataBind(); 
     }; 
     search.Search("plu"); 
    } 

我现在需要从提示获取的实际值,但是从值返回的数据是空的。我不知道为什么,请看看你是否能看到我看不到的东西。

编辑修正了JSON,失踪闭幕]为“面”

+2

哟耶,我从众你喜欢表,所以我们把列表中的列表,以便您可以列出,而你列出 – maxbeaudoin

+0

您可以添加代码,你真正做反序列化,由于 – maxbeaudoin

+0

已添加代码...我喜欢列表;) – Ghostfire

回答

0

对于DataContractJsonSerializer工作,你需要有一种系统与该JSON相匹配的模式。 “values”字段不是一个列表(或一个数组) - 它是另一个JSON对象,所以你不需要声明它为List<Value> - 它只是一个Value对象。

另外,termHints类中的DataMember Name属性为它们各自的成员设置为'Values'和'Facets',但在json中名称为小写,因此您还需要更改该属性(数据成员(名称= “值”)和DataMember(名称= “小面”)。

更新与代码

另一个问题我在代码中看到/ JSON是,JSON文档中,facets是一个termHints的兄弟,但是在你拥有的数据合同中,方面是提示的孩子,所以需要改变其中的一个。下面是两个版本的代码,随便挑一个:)

public class StackOverflow_6747339 
{ 
    class FacetsAsSiblingOfHints 
    { 
     [DataContract] 
     public class AutoCompleteResponse 
     { 
      [DataMember(Name = "parameters")] 
      public Parameter Parameters { get; set; } 
      [DataMember(Name = "termHints")] 
      public List<TermHints> Hints { get; set; } 
      [DataMember(Name = "facets")] 
      public List<Facets> Facets { get; set; } 
      [DataMember(Name = "total")] 
      public string Total { get; set; } 

      public override string ToString() 
      { 
       return string.Format("AutoCompleteResponse[Parameters={0},hints={1},facets={2},total={3}]", 
        Parameters, ListToString(Hints), ListToString(Facets), Total); 
      } 
     } 
     [DataContract] 
     public class Parameter 
     { 
      [DataMember(Name = "tbdb")] 
      public string tbdb { get; set; } 
      [DataMember(Name = "min_prefix_length")] 
      public string min_prefix_length { get; set; } 
      [DataMember(Name = "service")] 
      public string service { get; set; } 
      [DataMember(Name = "template")] 
      public string template { get; set; } 
      [DataMember(Name = "term_prefix")] 
      public string term_prefrix { get; set; } 

      public override string ToString() 
      { 
       return string.Format("Parameter[tbdb={0},min_prefix_length={1},service={2},template={3},term_prefix={4}]", 
        tbdb, min_prefix_length, service, template, term_prefrix); 
      } 
     } 
     [DataContract] 
     public class TermHints 
     { 
      [DataMember(Name = "name")] 
      public string Name { get; set; } 
      [DataMember(Name = "id")] 
      public string Id { get; set; } 
      [DataMember(Name = "values")] 
      public Values Values { get; set; } 

      public override string ToString() 
      { 
       return string.Format("TermHints[Name={0},Id={1},Values={2}]", Name, Id, Values); 
      } 
     } 
     [DataContract] 
     public class Values 
     { 
      [DataMember(Name = "value")] 
      public string value_name { get; set; } 
      [DataMember(Name = "pre_em")] 
      public string pre_em { get; set; } 
      [DataMember(Name = "em")] 
      public string em { get; set; } 
      [DataMember(Name = "post_em")] 
      public string post_em { get; set; } 
      [DataMember(Name = "nature")] 
      public string nature { get; set; } 
      [DataMember(Name = "id")] 
      public string value_id { get; set; } 

      public override string ToString() 
      { 
       return string.Format("Values[value_name={0},pre_em={1},em={2},post_em={3},nature={4},value_id={5}]", 
        value_name, pre_em, em, post_em, nature, value_id); 
      } 
     } 
     [DataContract] 
     public class Facets 
     { 
      [DataMember(Name = "id")] 
      public string facet_id { get; set; } 
      [DataMember(Name = "name")] 
      public string facet_name { get; set; } 

      public override string ToString() 
      { 
       return string.Format("Facets[facet_id={0},facet_name={1}]", facet_id, facet_name); 
      } 
     } 

     const string json = @"{ 
""parameters"": { 
    ""tbdb"": ""trudon"", 
    ""min_prefix_length"": ""2"", 
    ""service"": ""prefix"", 
    ""template"": ""service.json"", 
    ""term_prefix"": ""plu""}, 
""termHints"": [ 
    { 
     ""name"": ""Plumbers & Sanitary Engineers"", 
     ""id"":""209654"", 
     ""values"": { 
      ""value"":""Plumbers & Sanitary Engineers"", 
      ""pre_em"":"""", 
      ""em"":""Plu"", 
      ""post_em"":""mbers & Sanitary Engineers"", 
      ""nature"":""PT"", 
      ""id"":""209654"" 
     } 
    }, 
], 
""facets"": [ 
    { 
     ""id"":""209654"", 
     ""name"":""Plumbers & Sanitary Engineers"" 
    } 
], 
""total"":1 
}"; 

     internal static void Test() 
     { 
      Console.WriteLine("Facets as siblings of the hints"); 
      DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(AutoCompleteResponse)); 
      MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)); 
      AutoCompleteResponse obj = (AutoCompleteResponse)dcjs.ReadObject(ms); 
      ms.Close(); 
      Console.WriteLine(obj); 
      Console.WriteLine(); 
     } 
    } 

    class FacetsInsideHints 
    { 
     [DataContract] 
     public class AutoCompleteResponse 
     { 
      [DataMember(Name = "parameters")] 
      public Parameter Parameters { get; set; } 
      [DataMember(Name = "termHints")] 
      public List<TermHints> Hints { get; set; } 
      [DataMember(Name = "total")] 
      public string Total { get; set; } 

      public override string ToString() 
      { 
       return string.Format("AutoCompleteResponse[Parameters={0},hints={1},total={2}]", 
        Parameters, ListToString(Hints), Total); 
      } 
     } 
     [DataContract] 
     public class Parameter 
     { 
      [DataMember(Name = "tbdb")] 
      public string tbdb { get; set; } 
      [DataMember(Name = "min_prefix_length")] 
      public string min_prefix_length { get; set; } 
      [DataMember(Name = "service")] 
      public string service { get; set; } 
      [DataMember(Name = "template")] 
      public string template { get; set; } 
      [DataMember(Name = "term_prefix")] 
      public string term_prefrix { get; set; } 

      public override string ToString() 
      { 
       return string.Format("Parameter[tbdb={0},min_prefix_length={1},service={2},template={3},term_prefix={4}]", 
        tbdb, min_prefix_length, service, template, term_prefrix); 
      } 
     } 
     [DataContract] 
     public class TermHints 
     { 
      [DataMember(Name = "name")] 
      public string Name { get; set; } 
      [DataMember(Name = "id")] 
      public string Id { get; set; } 
      [DataMember(Name = "values")] 
      public Values Values { get; set; } 
      [DataMember(Name = "facets")] 
      public List<Facets> Facets { get; set; } 

      public override string ToString() 
      { 
       return string.Format("TermHints[Name={0},Id={1},Values={2},Facets={3}]", Name, Id, Values, ListToString(Facets)); 
      } 
     } 
     [DataContract] 
     public class Values 
     { 
      [DataMember(Name = "value")] 
      public string value_name { get; set; } 
      [DataMember(Name = "pre_em")] 
      public string pre_em { get; set; } 
      [DataMember(Name = "em")] 
      public string em { get; set; } 
      [DataMember(Name = "post_em")] 
      public string post_em { get; set; } 
      [DataMember(Name = "nature")] 
      public string nature { get; set; } 
      [DataMember(Name = "id")] 
      public string value_id { get; set; } 

      public override string ToString() 
      { 
       return string.Format("Values[value_name={0},pre_em={1},em={2},post_em={3},nature={4},value_id={5}]", 
        value_name, pre_em, em, post_em, nature, value_id); 
      } 
     } 
     [DataContract] 
     public class Facets 
     { 
      [DataMember(Name = "id")] 
      public string facet_id { get; set; } 
      [DataMember(Name = "name")] 
      public string facet_name { get; set; } 

      public override string ToString() 
      { 
       return string.Format("Facets[facet_id={0},facet_name={1}]", facet_id, facet_name); 
      } 
     } 

     const string json = @"{ 
""parameters"": { 
    ""tbdb"": ""trudon"", 
    ""min_prefix_length"": ""2"", 
    ""service"": ""prefix"", 
    ""template"": ""service.json"", 
    ""term_prefix"": ""plu""}, 
""termHints"": [ 
    { 
     ""name"": ""Plumbers & Sanitary Engineers"", 
     ""id"":""209654"", 
     ""values"": { 
      ""value"":""Plumbers & Sanitary Engineers"", 
      ""pre_em"":"""", 
      ""em"":""Plu"", 
      ""post_em"":""mbers & Sanitary Engineers"", 
      ""nature"":""PT"", 
      ""id"":""209654"" 
     }, 
     ""facets"": [ 
      { 
       ""id"":""209654"", 
       ""name"":""Plumbers & Sanitary Engineers"" 
      } 
     ] 
    }, 
], 
""total"":1 
}"; 

     internal static void Test() 
     { 
      Console.WriteLine("Facets inside the hints"); 
      DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(AutoCompleteResponse)); 
      MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)); 
      AutoCompleteResponse obj = (AutoCompleteResponse)dcjs.ReadObject(ms); 
      ms.Close(); 
      Console.WriteLine(obj); 
      Console.WriteLine(); 
     } 
    } 

    static string ListToString<T>(List<T> list) 
    { 
     if (list == null) 
     { 
      return "<<null>>"; 
     } 

     StringBuilder sb = new StringBuilder(); 
     sb.Append("["); 
     for (int i = 0; i < list.Count; i++) 
     { 
      if (i > 0) sb.Append(","); 
      sb.Append(list[i]); 
     } 

     sb.Append("]"); 
     return sb.ToString(); 
    } 

    public static void Test() 
    { 
     FacetsAsSiblingOfHints.Test(); 
     FacetsInsideHints.Test(); 
    } 
} 
+0

好吧,我对代码进行了建议修改,我有点误解了你最初的建议,但是在喝了一杯咖啡后发现了它。现在的问题是值类没有返回任何结果,它的全部空白......任何想法为什么?如此接近解决方案,它可能会拍我的脸..我已更新的代码..应该可能会改变标题以及.. – Ghostfire