如何获取复杂的JSON数据中的元素值

时间:2018-06-22 10:03:31

标签: c# json deserialization

在下面的JSON数据中是服务对象,其中包含多组对象。每个对象都包含itemCode对象和bCode值。我需要从每个itemCode对象中查找每个bCode,并在bcode值与任何列表项打印说明匹配时与列表进行比较。 我无法为每个bcode创建路径。

{
    "getResponse": {
        "dID": "B03",
        "aNumber": "45901",
        "services": [
            {
                "sIdentifier": "1",
                "itemCode": {
                    "bCode": "LAX005",
                    "eCode": "BASICSPPA",
                    "description": "Residential 50 ",
                    "lDescription": "SPPA Basic 01"
                },       
            },
            {
                "serviceIdentifier": "1",
                "itemCode": {
                    "bcode": "LAY010",
                    "ecode": "EXPBASICSPPA",
                    "description": "100",
                    "lDescription": "Residential 100"
                },
            },
            {
                "serviceIdentifier": "1",
                "itemCode": {
                    "bcode": "LAZ045",
                    "ecode": "FEEVBSURSP",
                    "description": " 200",
                    "lDescription": "Residential 200"
                },
            },
            {
                "serviceIdentifier": "1",
                "itemCode": {
                    "bcode": "LABX700",
                    "ecode": "HSIBASESPPA",
                    "description": "300",
                    "lDescription": "Residential 300"
                },
            },
            {
                "serviceIdentifier": "1",
                "itemCode": {
                    "bcode": "LABX905",
                    "ecode": "SPVTELLN00",
                    "description": "400",
                    "lDescription": "Residential 400"
                },
            },
        ],
        "sourceSystem": "04:00"
    }
}

我正在尝试类似的事情

public static void CreateObject()
    {
        List<string> bCode = new List<string>();
        string[] codes = { "BA00010", "BA00012", "BA00050", "BA00020", "BA00022", "BA00025", "BA00030", "LAZ045", "BA00040", "BA00060", "LA700" };
        billerCode.AddRange(codes);
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
        request.Method = "POST";
        request.ContentType = "application/json";
        request.ContentLength = DATA.Length;
        using (Stream webStream = request.GetRequestStream())
        using (StreamWriter requestWriter = new StreamWriter(webStream, System.Text.Encoding.ASCII))
        {
            requestWriter.Write(DATA);
        }

        try
        {
            WebResponse webResponse = request.GetResponse();
            using (Stream webStream = webResponse.GetResponseStream())
            {
                if (webStream != null)
                {
                    using (StreamReader responseReader = new StreamReader(webStream))
                    {
                        var response = responseReader.ReadToEnd();
                        var json = JObject.Parse(response);

                        dynamic deSerData = JsonConvert.DeserializeObject<Dictionary<string, object>>(json.ToString());
                        Dictionary<string, object> qoset_object= deSerData["getResponse"].ToObject<Dictionary<string, object>>();
                        foreach (var item in qoset_object)
                        {
                            if (item.Key == "services")
                            {
                                List<string> ut = new List<string>();
                              //  ut.Add(item.Value);

                            }
                        }
                        foreach (var item in bCode)
                        {

                        }
                    }
                }
            }
        }
        catch (Exception e)
        {
            Console.Out.WriteLine("-----------------");
            Console.Out.WriteLine(e.Message);
        }

    }
}

请提出任何建议。

2 个答案:

答案 0 :(得分:1)

由于您仅对某些属性感兴趣,因此可以将JObject与其一起使用,而不必将JSON反序列化为新类:

var obj = JObject.Parse(json);
var result = new List<string>();
var myBCodes = new List<string> {"LAX005"};

foreach (var jToken in obj["getResponse"]["services"].Select(s => s["itemCode"]))
{
    if (myBCodes.Contains(jToken["bCode"].ToString()))
        result.Add(jToken["description"].ToString());
}

答案 1 :(得分:0)

您必须创建这种模态

public class GetResponse
{
   public strin dID{ get; set; }
   public string aNumber{ get; set; }
   public services services{ get; set; }
   public string sourceSystem { get; set; }
}

public class services 
{
   public string sIdentifier{ get; set; }
   public List<itemCode> itemCode{ get; set; }      
}

public class itemCode
{
   public string bcode{ get; set; }
   public string ecode{ get; set; }
   public string description{ get; set; }
   public string lDescription{ get; set; }      
}

  GetResponse  getResponse = JsonConvert.DeserializeObject<GetResponse>(json.ToString());

//After that you will use foreach loop and get value from modal