簡體   English   中英

反序列化JSON並使用Linq將內容訪問JSon

[英]Deserialise JSON and access content using Linq to JSon

我將以下JSON存儲在要解析的cookie中:

{"package":[{"id":"5054","nodeId":"3286"},{"id":"8888","nodeId":"7777"}], "hotel":[{"id":"3421","nodeId":"1234"},{"id":"8748","nodeId":"2435"}], "activity":[{"id":"5054","nodeId":"3286"},{"id":"8888","nodeId":"7777"},{"id":"2131","nodeId":"2342"}]}

我從關於這個問題的公認答案中了解到, 使用Newtonsoft將JSON反序列化為.NET對象(或者可能是LINQ為JSON?) ,您可以使用以下代碼訪問JSON表示法中的單個對象:

JToken token = JObject.Parse(stringFullOfJson);

int page = (int)token.SelectToken("page");
int totalPages = (int)token.SelectToken("total_pages");

因此,我將其調整為以下代碼:

HttpCookie cookie = Request.Cookies.Get("wishlist");
string JSONstring = string.Empty;
string nodeId = string.Empty;

if (cookie != null)
{
    JSONstring = cookie.Value;
    JToken token = JObject.Parse(JSONstring);
}

現在,我僅想舉例說明package數組,並遍歷此數組中的每個項目,並以以下格式輸出id:

5054,8888

從示例代碼中,我想出了以下方法,但是我不確定我是否朝着正確的方向前進。

JObject obj = JObject.Parse(JSONstring);
JArray packages = (JArray)obj["package"];

指定數組之一的最佳方法是什么? hotel,package,遍歷其內容並輸出找到的每個id節點? nodeId始終為數字,但id可以為字符串或整數,因此這又增加了一層復雜性。

任何幫助將不勝感激,如果這是一個愚蠢或簡單的問題,我深表歉意,但是我已經開始使用.Net和OO,所以某些概念仍然有些模糊。

這是我的操作方法,我將創建反序列化JSON所需的類:

    public class JSONCookie
    {
        public Package[] package { get; set; }
        public Hotel[] hotel { get; set; }
        public Activity[] activity { get; set; }
    }

    public class Package
    {
        public string id { get; set; }
        public string nodeId { get; set; }
    }

    public class Hotel
    {
        public string id { get; set; }
        public string nodeId { get; set; }
    }

    public class Activity
    {
        public string id { get; set; }
        public string nodeId { get; set; }
    }

現在,我將創建一個實際上進行反序列化的方法:

public JSONCookie GetJSONCookieResponse()
        {
            try
            {
                // Add your own code that gets the Response Here.

                // string response = "{"package":[{"id":"5054","nodeId":"3286"},{"id":"8888","nodeId":"7777"}], "hotel":[{"id":"3421","nodeId":"1234"},{"id":"8748","nodeId":"2435"}], "activity":[{"id":"5054","nodeId":"3286"},{"id":"8888","nodeId":"7777"},{"id":"2131","nodeId":"2342"}]}";

                //return new JsonSerializer().Deserialize<JSONCookie>(new JsonTextReader(new StringReader(response)));
            }
            catch
            {
                return null;
            }
        }

然后從返回的JSONCookie對象中使用LINQ選擇所需的對象,如下所示:

x.package.Select(p=>p.id);

經過大量的Google搜尋,這是我想到的最簡單的解決方案:

HttpCookie cookie = Request.Cookies.Get("wishlist");
string JSONstring = string.Empty;
string nodeId = string.Empty;
string test = string.Empty;

if (cookie != null)
{
    JSONstring = cookie.Value;
    JObject obj = JObject.Parse(JSONstring);
    JArray packages = (JArray)obj["package"];

    foreach (var item in packages.Children()){
        var properties = item.Children<JProperty>();
        var idElement = properties.FirstOrDefault(x => x.Name == "id");
        var myElementValue = idElement.Value;

        test = test + myElementValue + ",";
    }
}

這將以CSV格式(帶有結尾的)輸出packages數組中的所有id。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM