Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.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_C#_Json_Json.net - Fatal编程技术网

C# 解析嵌套(我认为)JSON

C# 解析嵌套(我认为)JSON,c#,json,json.net,C#,Json,Json.net,我一直在尝试解析这个JSON字符串。我使用的是JSON.NET和JSON的一段代码,我的类和基本函数调用如下: {"status":"ok","apirate":"0","people":{ "Mike":{"id":"Mike","rating":"0.80","questions":"100"}, "Donald":{"id":"Donald","rating":"0.7","questions":"9"}, "Tony":{"id":"Tony","rating":"0.22","ques

我一直在尝试解析这个JSON字符串。我使用的是JSON.NET和JSON的一段代码,我的类和基本函数调用如下:

{"status":"ok","apirate":"0","people":{
"Mike":{"id":"Mike","rating":"0.80","questions":"100"},
"Donald":{"id":"Donald","rating":"0.7","questions":"9"},
"Tony":{"id":"Tony","rating":"0.22","questions":"2"},
"Penelope":{"id":"Penelope","rating":"0.006","questions":"6"},
"Sarah":{"id":"Sarah","rating":"0.79","questions":"20"},
"Thomas":{"id":"Thomas","rating":"0.12","questions":"25"},
"Gail":{"id":"Gail","rating":"0.44","questions":"35"}}}
我用作存储对象的类:

     public class Folks
    {
        public Folks()
        {
        }
        public String status;
        public String message; //optional
        public int apirate;
        public PeopleDetails[] people;
    }

      public class PeopleDetails 
    {
        public PeopleDetails ()
        {
        }
        public String id;
        public double rating;
        public int questions;
    }
最后,我在代码中所做的:

    Folks test = new Folks();
    test = JsonConvert.DeserializeObject<Folks>(myRequest.GetResponse());
people test=newpeople();
test=JsonConvert.DeserializeObject(myRequest.GetResponse());
状态和API速率正常,消息不存在,因为并没有错误,并且我的PeopleDetails数组出现异常。(编辑:抛出一个JsonSerializationException,因为该类型需要一个JSON数组才能正确地反序列化。)我尝试在粘贴到这里的两个类/对象之间放置另一个类/对象,并尝试了不同的集合,以此类推

所以。。。既然这是我第一次使用它(聪明,第一次选择复杂的东西),有人能告诉我一个解决方案吗


提前感谢。

首先,您给定的JSON不正确,penelope记录中缺少一个
{

因此正确的JSON应该是

{"status":"ok","apirate":"0","people":{
"Mike":{"id":"Mike","rating":"0.80","questions":"100"},
"Donald":{"id":"Donald","rating":"0.7","questions":"9"},
"Tony":{"id":"Tony","rating":"0.22","questions":"2"},
"Penelope":{"id":"Penelope","rating":"0.006","questions":"6"},
"Sarah":{"id":"Sarah","rating":"0.79","questions":"20"},
"Thomas":{"id":"Thomas","rating":"0.12","questions":"25"},
"Gail":{"id":"Gail","rating":"0.44","questions":"35"}}}
然后,如果你看一下这个结构,你可能会发现人不是一个列表,而是一本字典,名字是关键

这是一个有效的测试

    [TestMethod]
    public void Test()
    {
        var json = "{\"status\":\"ok\",\"apirate\":\"0\",\"people\":{\n\"Mike\":{\"id\":\"Mike\",\"rating\":\"0.80\",\"questions\":\"100\"},\n\"Donald\":{\"id\":\"Donald\",\"rating\":\"0.7\",\"questions\":\"9\"},\n\"Tony\":{\"id\":\"Tony\",\"rating\":\"0.22\",\"questions\":\"2\"},\n\"Penelope\":{\"id\":\"Penelope\",\"rating\":\"0.006\",\"questions\":\"6\"},\n\"Sarah\":{\"id\":\"Sarah\",\"rating\":\"0.79\",\"questions\":\"20\"},\n\"Thomas\":{\"id\":\"Thomas\",\"rating\":\"0.12\",\"questions\":\"25\"},\n\"Gail\":{\"id\":\"Gail\",\"rating\":\"0.44\",\"questions\":\"35\"}}}";
        var folks = JsonConvert.DeserializeObject<Folks>(json);

        Assert.AreEqual("ok", folks.Status);
    }

    public class Folks
    {
        public Folks()
        {
            this.People = new Dictionary<string, PeopleDetails>();
        }

        [JsonProperty("status")]
        public string Status { get; set; }

        [JsonProperty("message")]
        public string Message { get; set; }

        [JsonProperty("apirate")]
        public int Apirate { get; set; }

        [JsonProperty("people")]
        public Dictionary<string, PeopleDetails> People { get; set; }
    }

    public class PeopleDetails
    {
        [JsonProperty("id")]
        public string Id { get; set; }

        [JsonProperty("rating")]
        public decimal Rating { get; set; }

        [JsonProperty("questions")]
        public int Questions { get; set; }
    }
[TestMethod]
公开无效测试()
{
目前,人们将:{n\n”迈克\”迈克\,”迈克\ \,”迈克\”迈克\,”,”id id \”迈克\,”,”迈克\ \”迈克\,”,”迈克\ \”身份\ \,”,”现状\,”,”,”,”评级\”若若若若若倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒倒id\“:\”佩内洛普\“,\”评级\“:\”0.006\“,\”问题\“:\”6\”},\n“Sarah\”:{“id\”:“Sarah\”,“评级”:“0.79\”,“问题”:“20\”,\n“Thomas\”:{“id\”:“Thomas\”,“评级”:“0.12\”,“问题”:“25\”,\n“Gail\”:{“id\”:“Gail\”,“评级”:“0.44\,“问题”:“35\”;
var=JsonConvert.DeserializeObject(json);
Assert.AreEqual(“ok”,people.Status);
}
公共阶层的人
{
公众人士()
{
this.People=新字典();
}
[JsonProperty(“状态”)]
公共字符串状态{get;set;}
[JsonProperty(“消息”)]
公共字符串消息{get;set;}
[JsonProperty(“apirate”)]
公共整数Apirate{get;set;}
[JsonProperty(“人员”)]
公共字典人物{get;set;}
}
公共类人物详细信息
{
[JsonProperty(“id”)]
公共字符串Id{get;set;}
[JsonProperty(“评级”)]
公共十进制评级{get;set;}
[JsonProperty(“问题”)]
公共整数问题{get;set;}
}

您的json无效。我现在不知道这是打字错误还是由此引发的问题。我将编辑您的问题。@SAM这应该是答案,而不是编辑。无效将导致json解析失败,从而导致问题。“我的PeopleDetails数组正在生成异常”-什么异常?很可能你需要一个
字典
,因为数组键是字符串。我为含糊不清的描述道歉。沮丧和睡眠不足已经造成了损失。字典确实是答案。我还编辑了JSON,使其正确,并将异常添加到问题中,以防这可能有帮助其他人对这个问题不熟悉。@cholisky重要的是,你不要纠正JSON中的错误,这样其他观众就可以看到这个问题。展示错误也可以帮助其他观众学习,因为这也有助于其他观众学习;我们毕竟是人。这就是问题所在。我对c#和JSON都不熟悉,只使用过一次字典几年前在学校。这个解决方案非常有效。