反序列化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所需的类:-
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(以,结尾)