- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我被困在解析 JSon 上,无法弄清楚。它在 IDictionary 数组中给了我 NULL。这是我所拥有的:
{
"response" : {
"method" : "my.current.method",
"result" : {
"current_calls" : {
"current_call" : [
{
"provider" : "ABC",
"start_time" : "2014-11-30 02:24:52",
"duration" : "5",
"to_caller_id_number" : "800",
"state" : "ivr",
"from_caller_id_name" : "<unknown>",
"to_caller_id_name" : "Main Answer Queue",
"format" : "ulaw",
"from_caller_id_number" : "1234567890",
"id" : "SIP/1234567890-08682a00"
},
{
"provider" : "ThinkTel",
"start_time" : "2014-11-30 02:24:50",
"duration" : "7",
"to_caller_id_number" : "800",
"state" : "ivr",
"from_caller_id_name" : "<unknown>",
"to_caller_id_name" : "Main Answer Queue",
"format" : "ulaw",
"from_caller_id_number" : "0123456789",
"id" : "SIP/0123456789-08681350"
}
],
"total_items" : "2"
}
}
}
}
然后我的 C# 代码中有以下内容:
public class Data
{
public Response response { get; set; }
}
public class Response
{
public string method { get; set; }
public Result result { get; set; }
}
public class Result
{
public CurrentCalls current_calls { get; set; }
}
public class CurrentCalls
{
public List<IDictionary<string, Current_call>> current_calls { get; set; }
public int total_items { get; set; }
}
public class Current_call
{
public string provider { get; set; }
public DateTime start_time { get; set; }
public int duration { get; set; }
public string to_caller_id_number { get; set; }
public string state { get; set; }
public string from_caller_id_name { get; set; }
public string to_caller_id_name { get; set; }
public string format { get; set; }
public string from_caller_id_number { get; set; }
public string id { get; set; }
}
public class Data
{
public Response response { get; set; }
}
public class Response
{
public string method { get; set; }
public Result result { get; set; }
}
public class Result
{
public CurrentCalls current_calls { get; set; }
}
public class CurrentCalls
{
public List<IDictionary<string, Current_call>> current_calls { get; set; }
public int total_items { get; set; }
}
public class Current_call
{
public string provider { get; set; }
public DateTime start_time { get; set; }
public int duration { get; set; }
public string to_caller_id_number { get; set; }
public string state { get; set; }
public string from_caller_id_name { get; set; }
public string to_caller_id_name { get; set; }
public string format { get; set; }
public string from_caller_id_number { get; set; }
public string id { get; set; }
}
我这样反序列化它:
allCalls = JsonConvert.DeserializeObject<Data>(json);
然后我尝试在下面使用它:
if (parser.allCalls.response.result.current_calls.current_calls != null)
{
foreach (var defindex in parser.allCalls.response.result.current_calls.current_calls)
{
foreach (var call in defindex) {
System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\A\\Testing\\test" + i + ".txt");
file.WriteLine("Current call:" );
file.WriteLine("\t Provider: " + call.Value.provider);
file.WriteLine("\t Start Tine: " + call.Value.start_time);
file.WriteLine("\t Duration: " + call.Value.duration);
file.WriteLine("\t To Caller: " + call.Value.to_caller_id_number);
file.WriteLine("\t State: " + call.Value.state);
file.WriteLine("\t From: " + call.Value.from_caller_id_name);
file.WriteLine("\t To Name: " + call.Value.to_caller_id_name);
file.WriteLine("\t Format: " + call.Value.format);
file.WriteLine("\t From Caller ID: " + call.Value.from_caller_id_number);
file.WriteLine("\t ID: " + call.Value.id);
file.Close();
}
}
}
因此 Total Items 的值为 2 ok。我似乎无法理解 IDictionary 的数组。它为空。请帮忙。 (这是使用 Newtonsoft 顺便说一句)
最佳答案
加载 fiddle 页面后等待几秒钟,然后查看底部的控制台输出 Pane 。
这是解决方案的完整代码。
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public class Program
{
// Solution to SO Question: http://stackoverflow.com/q/27217095/325521
// This Answer: http://stackoverflow.com/a/27238215/325521
// Author: Shiva Manjunath
// SO Profile: http://stackoverflow.com/users/325521/shiva
public static void Main()
{
string jsonString = @"{
""response"" : {
""method"" : ""my.current.method"",
""result"" : {
""current_calls"" : {
""current_call"" : [
{
""provider"" : ""ABC"",
""start_time"" : ""2014-11-30 02:24:52"",
""duration"" : ""5"",
""to_caller_id_number"" : ""800"",
""state"" : ""ivr"",
""from_caller_id_name"" : ""<unknown>"",
""to_caller_id_name"" : ""Main Answer Queue"",
""format"" : ""ulaw"",
""from_caller_id_number"" : ""1234567890"",
""id"" : ""SIP/1234567890-08682a00""
},
{
""provider"" : ""ThinkTel"",
""start_time"" : ""2014-11-30 02:24:50"",
""duration"" : ""7"",
""to_caller_id_number"" : ""800"",
""state"" : ""ivr"",
""from_caller_id_name"" : ""<unknown>"",
""to_caller_id_name"" : ""Main Answer Queue"",
""format"" : ""ulaw"",
""from_caller_id_number"" : ""0123456789"",
""id"" : ""SIP/0123456789-08681350""
}
],
""total_items"" : ""2""
}
}
}
}";
Console.WriteLine("BEGIN JSON Deserialization\n");
var callData = Newtonsoft.Json.JsonConvert.DeserializeObject<CallData>(jsonString);
// extract the current list of calls in the response
var callsList = callData.response.result.current_calls.current_call;
// check if there are any calls
if (callsList.Any())
{
Console.WriteLine(" Number of Call Records Received via JSON = {0}\n", callsList.Count());
int i = 1;
// print out call details for each call.
foreach(var oneCall in callsList)
{
Console.WriteLine(" Call #" + i);
Console.WriteLine(" provider: " + oneCall.provider);
Console.WriteLine(" start_time: " + oneCall.start_time);
Console.WriteLine(" duration: " + oneCall.duration);
Console.WriteLine(" to_caller_id_number: " + oneCall.to_caller_id_number);
Console.WriteLine(" state: " + oneCall.state);
Console.WriteLine(" from_caller_id_name: " + oneCall.from_caller_id_name);
Console.WriteLine(" to_caller_id_name: " + oneCall.to_caller_id_name);
Console.WriteLine(" format: " + oneCall.format);
Console.WriteLine(" from_caller_id_number: " + oneCall.from_caller_id_number);
Console.WriteLine(" id: {0}\n", oneCall.id);
i++;
}
}
Console.WriteLine("\nEND JSON Deserialization");
}
}
public class CurrentCall
{
public string provider { get; set; }
public string start_time { get; set; }
public string duration { get; set; }
public string to_caller_id_number { get; set; }
public string state { get; set; }
public string from_caller_id_name { get; set; }
public string to_caller_id_name { get; set; }
public string format { get; set; }
public string from_caller_id_number { get; set; }
public string id { get; set; }
}
public class CurrentCalls
{
public List<CurrentCall> current_call { get; set; }
public string total_items { get; set; }
}
public class Result
{
public CurrentCalls current_calls { get; set; }
}
public class Response
{
public string method { get; set; }
public Result result { get; set; }
}
public class CallData
{
public Response response { get; set; }
}
请注意,您可以在 POCO 上使用 JsonProperty
,这样您就可以摆脱 C# 类中的 _
下划线和小写等。
例如:
public class Result
{
[JsonProperty(PropertyName = "current_calls")]
public CurrentCalls Calls { get; set; }
}
关于c# - Newtonsoft使用类数据结构解析Json数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27217095/
我在谷歌上花了很长时间,所以如果这是一个简单的修复请原谅我,但我找不到任何与 C# 中这个特定问题的修复相关的内容。 当尝试使用以下代码时,出现此错误: string obj = JsonConver
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 去年关闭。 Improve this
我正在尝试重新创建这个 json: { "request": { " TestRequest": { "OrderID": {
我正在测试我的 Web API。模拟数据我有这个: var objs = ((JArray)JsonConvert.DeserializeObject("{ \"PrintId\":10,\"Head
目前正在尝试使用 fixer.io API 在 C# 中创建货币转换。 我在从 Twitter API 解析 JSON 时使用了与下面类似的方法,并且没有任何问题,我不完全确定这里发生了什么。 API
我正在尝试建立 Mike Jansen 的 JIRA REST Client ,我正在尝试提取 JIRA 版本信息。我是 JSON 的新手,所以我不确定这只是格式问题还是什么。 调试时,我有以下标记:
我正在尝试使用 将对象动态序列化到即时窗口中 Newtonsoft.Json.JsonConvert.SerializeObject(myObj); 但是我得到以下错误 The type 'Newto
我无法在 Visual Studio 2013 中构建解决方案。 这发生在我将我的 JSON.NET 包更新到 6.0.1 之后。在此之前,它就像一个魅力。 有什么想法吗? PS:这可能是关于 OWI
当有如下代码时 var TermSource = token.Value("annotations") .Values("Term Source") .FirstOrDefault
我需要将选中的复选框代码从 JavaScript 传递给 C#。我能够通过 JSON 发送代码。我的 JSON 值以 JArray 的形式出现。我在标题中得到了异常(exception)。 JSON:
注意:解决重定向问题后,我遇到了另一个问题,即出现错误“无法将 Newtonsoft.Json.Linq.JArray 转换为 Newtonsoft.Json.Linq.JToken”。因此,在我的回
我有以下简单的 POCO: public class ApiKey { public ApiKey(string key, string owner, List claims = nu
我查过这个问题,但我没有看到太多答案,显然没有一个有帮助,否则我不会问。我是 .NET 新手。 我的本地环境是Win7,Microsoft Virtual Web Developer 2010 Exp
好的-我已经将这个问题打了几个小时。是时候寻求帮助了。 我刚刚将Web应用程序项目升级到ASP.NET MVC 4 RC和新的WebApi。 我的Web api方法现在返回EMPTY json“{}”
我想忽略类中的某些属性,但出于多种原因我想保留类 POCO。因此我不想引入对 Json.NET 的依赖,也不想使用 JsonIgnoreAttribute。 有没有办法自定义契约(Contract)解
我正在尝试修复我编写的 WinForms 程序中的错误;我正在解析一个 JSON 字符串,然后将一些结果放入各种变量中。 有时,JSON 的特定元素不存在(出于真正的原因),因此我尝试使用以下代码来处
我只是尝试使用 C# 中的 Newtonsoft JSON 库将文件中的一些 JSON 反序列化为对象列表。以下是 MeetingFile.txt 文件的内容: [ { "People":
这是一个非常奇怪的错误发生。我有这些对象: public class Mobile_SettingModels { public string Token { get; set; }
我粘贴了 http://www.codeproject.com/Tips/789481/Bridging-the-Gap-between-Linqpad-and-Visual-Studio 中的代码进
这个问题在这里已经有了答案: Can I optionally turn off the JsonIgnore attribute at runtime? (3 个答案) 关闭 4 年前。 我目前正
我是一名优秀的程序员,十分优秀!