反序列化JSON对象和访问嵌套值

本文关键字:嵌套 访问 JSON 对象 反序列化 | 更新日期: 2023-09-27 18:11:12

我在这里写,因为我认为我已经使用了我能得到的所有资源。我的抽象/方法一定有严重的问题,因为我不能让它正常工作。任务很简单-我需要通过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。但是我不能访问Service.service_host的值。我着重于使用

的方法
NagiosRootObject obj = JsonConvert.DeserializeObject<NagiosRootObject>(json);

我有以上所有,我使用Json。. NET from http://json.codeplex.com.

我已经尝试了

的提示
  • 将JSON对象反序列化为c#列表

  • c#反序列化JSON数组(或列表)

  • c# -如何在类上实现IEnumerator

  • 将Json反序列化为Asp.net中实现Ienumerable的类

和几个相关但没有运气的人。

知道有这么多的教程,却不能利用它,这让我真的很难过。我很感激你的帮助。这篇文章是完成这项任务的最后手段。我需要认真的建议。谢谢你

反序列化JSON对象和访问嵌套值

使用json。下面的代码工作:(将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中有一个空元素{}

编辑:你的代码在我的测试中工作得很好,所以不需要改变它。

你试过了吗:

var obj = new JavaScriptSerializer().Deserialize<NagiosRootObject>(jsonString);

如果你想在服务器中解析这个json,那么最好将这个json解析成XML并利用该XML进行遍历。在服务器端编码中,xml遍历很容易。特别是在c#中。

使用newtonsoft dll将json转换为XMl或反过来。将json解析为XMl的代码为

 XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(json);

从链接中加载dllhttp://json.codeplex.com/