0
WebClient client = new WebClient();
Stream stream = client.OpenRead(" some link ");
StreamReader reader = new StreamReader(stream);

Newtonsoft.Json.Linq.JObject jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine());
List<String> list = new List<string>();


//loading list
for (int i = 0; i < ((string)jObject["some_stream"][i]["some_channel"]["some_name"]).Count(); i++)
{

  string result = ((string)jObject["some_streams"][i]["some_channel"]["some_name"]);
  list.Insert(i, result);

}

stream.Close();

此代码有效,但在 json 数据中,我应该返回 20 多个结果,但我只得到 8 个。

可能是什么原因?

4

1 回答 1

1

您正在计算字符串的长度。在某些时候,该字符串的长度等于或小于 i(如果您设法迭代 8 次,则为字符串的第 9 个值)

就是这段代码

((string)jObject["some_stream"][i]["some_channel"]["some_name"]).Count()

返回位置处字符串的长度,i因此如果您设法迭代 8 次,则 jObject["some_stream"][9]["some_channel"]["some_name"] 处的字符串的长度为 9 或更短,此时循环结束

从用法来看,jObject["Some_stream"]在这种情况下,它看起来像返回一个数组,你可以做的是这样的:

var arr = (Treal[])jObject["Some_stream"];
var list = (from obj in arr
           select ((string)obj["some_channel"]["some_name"])).ToList();

您需要用 jObject["Some_stream"] 的实际类型替换 TReal

旁白:当您打开流时,最好在 using 语句中执行此操作。在您的代码中,如果出现异常,则不会关闭流,然后代码将是

WebClient client = new WebClient();  
using(var stream = client.OpenRead(" some link ")) {
    reader = new StreamReader(stream);   
    var jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine());  
    var arr = (Treal[])jObject["Some_stream"];
    var list = (from obj in arr
               select ((string)obj["some_channel"]["some_name"])).ToList();
}
于 2012-09-25T10:35:15.317 回答