我在这里写,因为我认为我使用了所有可以得到的资源。我的抽象/方法必定存在严重错误,因为我不能 让它正常工作。任务很简单 - 我需要遍历从json输入生成的嵌套列表(??)(或者我从头开始做错了)。 使用jquery与这个json工作得很好,但这次我需要在服务器端处理数据。
我收到了json输入(下面的示例摘录):
{
"services":[
{
"service_status":"CRITICAL",
"service_host":{
"host_status":2,
"host_address":"192.168.1.12",
"host_name":"test1app_srv",
"host_problem_has_been_acknowledged":0,
"host_has_comments":0,
"host_notifications_enabled":1,
"host_checks_enabled":1,
"host_is_flapping":0,
"host_scheduled_downtime_depth":0,
"host_notes_url":"",
"host_action_url":"",
"host_icon_image":"server.gif"
},
"service_description":"test1app_srv",
"service_problem_has_been_acknowledged":0,
"service_has_comments":0,
"service_accept_passive_service_checks":1,
"service_notifications_enabled":1,
"service_checks_enabled":1,
"service_is_flapping":0,
"service_scheduled_downtime_depth":0,
"service_notes_url":"",
"service_action_url":"",
"service_icon_image":"services.gif",
"service_state_duration":" 0d 0h 2m 7s",
"service_last_check":"04-27-2013 23:49:55",
"service_current_attempt":1,
"service_max_attempts":1,
"service_plugin_output":"CRITICAL - Throughput : Threshold '600' failed for value 720"
},
{}
]
}
从中使用http://json2csharp.com/生成了c#类:
public class ServiceHost
{
public int host_status { get; set; }
public string host_address { get; set; }
public string host_name { get; set; }
public int host_problem_has_been_acknowledged { get; set; }
public int host_has_comments { get; set; }
public int host_notifications_enabled { get; set; }
public int host_checks_enabled { get; set; }
public int host_is_flapping { get; set; }
public int host_scheduled_downtime_depth { get; set; }
public string host_notes_url { get; set; }
public string host_action_url { get; set; }
public string host_icon_image { get; set; }
}
public class Service
{
public string service_status { get; set; }
public ServiceHost service_host { get; set; }
public string service_description { get; set; }
public int service_problem_has_been_acknowledged { get; set; }
public int service_has_comments { get; set; }
public int service_accept_passive_service_checks { get; set; }
public int service_notifications_enabled { get; set; }
public int service_checks_enabled { get; set; }
public int service_is_flapping { get; set; }
public int service_scheduled_downtime_depth { get; set; }
public string service_notes_url { get; set; }
public string service_action_url { get; set; }
public string service_icon_image { get; set; }
public string service_state_duration { get; set; }
public string service_last_check { get; set; }
public int service_current_attempt { get; set; }
public int service_max_attempts { get; set; }
public string service_plugin_output { get; set; }
}
public class NagiosRootObject
{
public List<Service> services { get; set; }
}
我设法获取NagiosRootObject.services内容但我无法访问Service.service_host中的值。 我专注于利用
的方法NagiosRootObject obj = JsonConvert.DeserializeObject<NagiosRootObject>(json);
我已经完成了上述所有工作,我正在使用http://json.codeplex.com中的Json.NET。
我尝试了
的提示并且很少相关,但没有运气。
知道有这么多的教程而且无法使用它让我真的很难过...... 帮助将不胜感激。这篇文章是这项任务的最后手段......我需要认真的提示。谢谢
答案 0 :(得分:0)
使用json.NET以下代码可以正常工作:(将json放入名为'json.txt'的文件中后)
using (var reader = File.OpenText("json.txt"))
{
var ser = JsonSerializer.Create(null);
var jReader = new JsonTextReader(reader);
var grp = ser.Deserialize<NagiosRootObject>(jReader);
}
但是,列表由两个对象填充,在第二个对象中,所有值都为null
。这是因为你的json中有一个空元素{}
。
编辑:您的代码在我的测试中同样有效,因此无需更改。
答案 1 :(得分:0)
你试过了吗?
var obj = new JavaScriptSerializer().Deserialize<NagiosRootObject>(jsonString);
答案 2 :(得分:-5)
如果要在服务器中解析这个json,那么最好将这个json解析为XML并利用该xml进行遍历。在服务器端编码xml遍历很容易。特别是在C#中。
使用newtonsoft dll将json转换为XMl或反之亦然。将json解析为XMl的代码是
XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(json);
从链接中加载dll http://json.codeplex.com/
我希望这会对你有所帮助。