- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是使用 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 文档中,facets
是 termHints
的 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/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
在编码时,我问了自己这个问题: 这样更快吗: if(false) return true; else return false; 比这个? if(false) return true; return
如何在逻辑条件下进行“返回”? 在这样的情况下这会很有用 checkConfig() || return false; var iNeedThis=doSomething() || return fa
这是我的正则表达式 demo 如问题所述: 如果第一个数字是 1 则返回 1 但如果是 145 则返回 145 但如果是 133 则返回 133 样本数据a: K'8134567 K'81345678
在代码高尔夫问答部分查看谜题和答案时,我遇到了 this solution返回 1 的最长和最晦涩的方法 引用答案, int foo(void) { return! 0; } int bar(
我想在下面返回 JSON。 { "name": "jackie" } postman 给我错误。说明 Unexpected 'n' 这里是 Spring Boot 的新手。 1日龄。有没有正确的方法来
只要“is”返回 True,“==”不应该返回 True 吗? In [101]: np.NAN is np.nan is np.NaN Out[101]: True In [102]: np.NAN
我需要获取所有在 6 号或 7 号房间或根本不在任何房间的学生的详细信息。如果他们在其他房间,简单地说,我不希望有那个记录。 我的架构是: students(roll_no, name,class,.
我有一个表单,我将它发送到 php 以通过 ajax 插入到 mysql 数据库中。一切顺利,php 返回 "true" 值,但在 ajax 中它显示 false 消息。 在这里你可以查看php代码:
我在 Kotlin 中遇到了一个非常奇怪的无法解释的值比较问题,以下代码打印 假 data class Foo ( val a: Byte ) fun main() { val NUM
请注意,这并非特定于 Protractor。问题在于 Angular 2 的内置 Testability service Protractor 碰巧使用。 Protractor 调用 Testabil
在调试窗口中,以下表达式均返回 1。 Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & "
我在本地使用 jsonplaceholder ( http://jsonplaceholder.typicode.com/)。我正在通过 extjs rest 代理测试我的 GET 和 POST 调用
这是 Postman 为成功调用我的页面而提供的(修改后的)代码段。 var client = new RestClient("http://sub.example.com/wp-json/wp/v2
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我想我对 C 命令行参数有点生疏。我查看了我的一些旧代码,但无论这个版本是什么,都会出现段错误。 运行方式是 ./foo -n num(其中 num 是用户在命令行中输入的数字) 但不知何故它不起作用
我已经编写了一个类来处理命名管道连接,如果我创建了一个实例,关闭它,然后尝试创建另一个实例,调用 CreateFile() 返回 INVALID_HANDLE_VALUE,并且 GetLastErro
即使 is_writable() 返回 true,我也无法写入文件。当然,该文件存在并且显然是可读的。这是代码: $file = "data"; echo file_get_contents($fil
下面代码中的变量 $response 为 NULL,尽管它应该是 SOAP 请求的值。 (潮汐列表)。当我调用 $client->__getLastResponse() 时,我从 SOAP 服务获得了
我一直在网上的不同论坛上搜索答案,但似乎没有与我的情况相符的... 我正在使用 Windows 7,VS2010。 我有一个使用定时器来调用任务栏刷新功能的应用程序。在该任务栏函数中包含对 LoadI
我是一名优秀的程序员,十分优秀!