Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化JSON并使用Linq to JSON访问内容_C#_.net_Json_Linq_Deserialization - Fatal编程技术网

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

C# 反序列化JSON并使用Linq to JSON访问内容,c#,.net,json,linq,deserialization,C#,.net,Json,Linq,Deserialization,我将以下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":"

我将以下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"}]}
我从这个问题的公认答案中了解到,您可以使用以下代码访问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;
            }
        }

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

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 + ",";
    }
}
HttpCookie cookie=Request.Cookies.Get(“愿望列表”);
string JSONstring=string.Empty;
string nodeId=string.Empty;
string test=string.Empty;
if(cookie!=null)
{
JSONstring=cookie.Value;
JObject obj=JObject.Parse(JSONstring);
JArray软件包=(JArray)obj[“软件包”];
foreach(packages.Children()中的var项){
var properties=item.Children();
var idElement=properties.FirstOrDefault(x=>x.Name==“id”);
var myElementValue=idElement.Value;
测试=测试+myElementValue+“,”;
}
}

这将以CSV格式输出packages数组中的所有ID(带有尾随的,)

感谢Derek。我忘了提到,就我所知,这一切都将在razor视图中运行,类并不是一个真正的选项,对于这个解决方案来说可能有点重。@Derek您不需要3个不同的类包Hotel和Activity。一个单独的类节点足够了,这不是更短吗:
var jObj=JsonConvert.DeserializeObject(JSON);var csv=String.Join(“,”,jObj.SelectMany(x=>x.Value).Select(x=>x.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 + ",";
    }
}