C# 返回列表中的列表的Json
我不熟悉使用JSON,我正在努力在列表中返回一个列表。我得到以下JSON:C# 返回列表中的列表的Json,c#,json,datacontractserializer,C#,Json,Datacontractserializer,我不熟悉使用JSON,我正在努力在列表中返回一个列表。我得到以下JSON: { "parameters": { "tbdb": "trudon", "min_prefix_length": "2", "service": "prefix", "template": "service.json", "term_prefix": "plu"}, "termHints": [ {
{
"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对其进行了去序列化,如下所示:
编辑:做出了carlosfigueira在此建议的更改
我创建的回报如下所示:
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");
}
protectedvoid cmdSearch\u单击(对象发送方,事件参数e)
{
AutocompleteWhat search=新的AutocompleteWhat()
{
Num=2
};
search.SearchCompleted+=(a,b)=>
{
列表_值=新列表();
foreach(b.response.hints中的术语提示项)
{
_增加价值(项目价值);
}
如果(_value.Count>0)
{
dgvResults.DataSource=_值;
}
其他的
{
dgvResults.DataSource=null;
}
dgvResults.DataBind();
};
搜索。搜索(“plu”);
}
我现在需要从提示中获取实际值,但是从值返回的数据是空的。我不知道为什么,请看看你是否能看到我看不到的东西
编辑修复了Json,缺少了“facets”的结尾]对于
DataContractJsonSerializer
,要工作,您需要使用与Json匹配的模式的a类型系统。“values”字段不是列表(或数组)——它是另一个JSON对象,因此您不需要将其声明为列表
——它只是一个值对象
此外,TermHitts类上的DataMember名称属性被设置为各自成员的“值”和“Facets”,但在json中,名称是小写的,因此您还需要更改它们(DataMember(Name=“Values”)和DataMember(Name=“Facets”)
使用代码更新
我在code/JSON中看到的另一个问题是,在JSON文档中,facets
是TermHitts
的兄弟,但在您拥有的数据契约中,facets是提示的子项。因此其中一个需要更改。下面是两个版本的代码,只需选择一个:)
公共类堆栈溢出\u 6747339
{
他的同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族同族
{
[数据合同]
公共类自动完成响应
{
[DataMember(Name=“parameters”)]
公共参数参数{get;set;}
[DataMember(Name=“termshits”)]
公共列表提示{get;set;}
[DataMember(Name=“facets”)]
公共列表面{get;set;}
[DataMember(Name=“total”)]
公共字符串总计{get;set;}
公共重写字符串ToString()
{
返回string.Format(“自动完成响应[参数={0},提示={1},面={2},总计={3}]”,
参数、ListToString(提示)、ListToString(刻面)、总计;
}
}
[数据合同]
公共类参数
{
[数据成员(Name=“tbdb”)]
公共字符串tbdb{get;set;}
[数据成员(Name=“最小前缀长度”)]
公共字符串最小前缀长度{get;set;}
[DataMember(Name=“service”)]
公共字符串服务{get;set;}
[DataMember(Name=“template”)]
公共字符串模板{get;set;}
[DataMember(Name=“term_前缀”)]
公共字符串项_preflix{get;set;}
公共重写字符串ToString()
{
返回string.Format(“参数[tbdb={0},最小前缀\长度={1},服务={2},模板={3},术语\前缀={4}]”,
tbdb、最小前缀长度、服务、模板、术语前缀);
}
}
[数据合同]
公共类术语提示
{
[数据成员(Name=“Name”)]
公共字符串名称{get;set;}
[数据成员(Name=“id”)]
公共字符串Id{get;set;}
[DataMember(Name=“values”)]
公共值值{get;set;}
公共重写字符串ToString()
{
返回string.Format(“termHitts[Name={0},Id={1},Values={2}]”,Name,Id,Values);
}
}
[数据合同]
公共阶级价值观
{
[DataMember(Name=“value”)]
公共字符串值_name{get;set;}
[数据成员(Name=“pre_em”)]
公共字符串pre_em{get;set;}
[数据成员(Name=“em”)]
公共字符串em{get;set;}
[数据成员(Name=“post_em”)]
公共字符串post_em{get;set;}
[DataMember(Name=“nature”)]
公共字符串性质{get;set;}
[数据成员(Name=“id”)]
公共字符串值_id{get;set;}
公共重写字符串ToString()
{
返回string.Format(“Values[value\u name={0},pre\u em={1},em={2},post\u em={3},nature={4},value\u id={5}]”,
值(名称、前值、后值、性质、值id);
}
}
[数据合同]
公共类方面
{
[数据成员(Name=“id”)]
公共字符串facet_id{get;set;}
[数据成员(Name=“Name”)]
公共字符串facet_name{get;set;}
公共重写字符串ToString()
{
返回string.Format(“Facets[facet\u id={0},facet\u name={1}]”,facet\u id,facet\u name);
}
}
常量字符串json=@”{
“参数”:{
“tbdb”:“trudon”,
“min___le
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");
}
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();
}
}