gpt4 book ai didi

c# - Json 返回列表中的列表

转载 作者:太空宇宙 更新时间:2023-11-03 16:43:19 25 4
gpt4 key购买 nike

我是使用 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 对其进行了反序列化,它看起来如下所示:

已编辑:在此处进行了 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,缺少“facets”的结束]

最佳答案

对于 DataContractJsonSerializer要工作,您需要具有与 JSON 匹配的模式的类型系统。 “值”字段不是列表(或数组)——它是另一个 JSON 对象,因此您无需将其声明为 List<Value>。 - 它只是一个值对象。

此外,termHints 类上的 DataMember Name 属性针对它们各自的成员设置为“Values”和“Facets”,但在 json 中,名称是小写的,因此您也需要更改它( DataMember(Name = "values") 和 DataMember(Name = "facets")。

用代码更新

我在代码/JSON 中看到的另一个问题是在 JSON 文档中,facetstermHints 的 sibling ,但在您拥有的数据契约(Contract)中,构面是提示的子项。所以其中一个需要改变。下面是两个版本的代码,只选一个:)

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();
}
}

关于c# - Json 返回列表中的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6747339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com