Попробуйте использовать следующий код:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("URL");
JArray array = new JArray();
using (var twitpicResponse = (HttpWebResponse)request.GetResponse())
using (var reader = new StreamReader(twitpicResponse.GetResponseStream()))
{
JavaScriptSerializer js = new JavaScriptSerializer();
var objText = reader.ReadToEnd();
JObject joResponse = JObject.Parse(objText);
JObject result = (JObject)joResponse["result"];
array = (JArray)result["Detail"];
string statu = array[0]["dlrStat"].ToString();
}
Это потому, что data
- итератор, вы можете использовать итератор только один раз. Например:
lst = [1, 2, 3]
it = iter(lst)
next(it)
=> 1
next(it)
=> 2
next(it)
=> 3
next(it)
=> StopIteration
Если мы перемещаем некоторые данные с помощью цикла for
, последний StopIteration
приведет к его завершению в первый раз. Если мы снова попытаемся перебрать его , мы будем получать исключение StopIteration
, потому что итератор уже был использован.
Теперь для второго вопроса: что делать, если нам do нужно переходить через итератор более одного раза? Простым решением было бы создать список с элементами, и мы можем проходить его столько раз, сколько необходимо. Это все в порядке, если в списке несколько элементов:
data = list(db[3])
Но если есть много элементов, лучше создать независимые итераторы, используя tee()
:
import itertools
it1, it2 = itertools.tee(db[3], n=2) # create as many as needed
Теперь мы можем поочередно перебирать по очереди:
for e in it1:
print("doing this one time")
for e in it2:
print("doing this two times")
Как только итератор исчерпан, он больше ничего не даст.
>>> it = iter([3, 1, 2])
>>> for x in it: print(x)
...
3
1
2
>>> for x in it: print(x)
...
>>>
Я хочу выполнить ответ @ ÓscarLópez для тех, кто ищет решение в 2017 году и использует python 2.7 или 3.
Метод tee () теперь не принимает аргументов ключевых слов и ждет второго аргумента целое число, а не ключевое слово. Это правильный способ использования tee ():
import itertools
it1, it2 = itertools.tee(db[3], 2)