反序列化JSON并使用Linq to JSON访问内容

本文关键字:JSON 访问 to 反序列化 Linq | 更新日期: 2023-09-27 18:10:42

我在cookie中存储了以下JSON,我希望对其进行解析:

{"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(或LINQ到JSON)将JSON反序列化到。net对象的公认答案中了解到,您可以使用以下代码访问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);
}

我现在希望只检索包数组,并循环遍历该数组中的每个项目,并以以下格式输出id:

5054,8888

从示例代码中,我想出了以下方法,但我不确定我是否在正确的方向上进行。

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

指定其中一个数组的最佳方法是什么?Hotel、package、遍历它们的内容并输出找到的每个id节点?nodeId将始终是数字,但id可以是字符串或int,所以这增加了另一层复杂性。

如果这是一个愚蠢或简单的问题,我将非常感谢任何帮助,我很抱歉,但是我刚刚开始使用。net和OO,所以一些概念仍然有点模糊。

反序列化JSON并使用Linq to JSON访问内容

我会这样做,我会创建反序列化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);

在谷歌搜索了很多之后,这是我想到的最简单的解决方案:

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格式输出包数组中的所有id(以,结尾)