2014-10-22 3 views
1

Я хочу ответ json от xml_parser view.I получаю только один dict вместо нескольких dict .. кажется, моя логика цикла неправильная .. вы можете исправить это для меня ..?python for loop not return multiple dict

def xml_parser(request): 
    for child in root.findall('GetAll'): 
     for geoloc in child.iter('loc'): 
      geoinfo = geoloc.attrib 
      pprint.pprint(geoinfo) 
    jsoninfo = json.dumps(geoinfo, ensure_ascii=False) 
    return HttpResponse(jsoninfo, content_type='application/json') 

Хорошо, теперь pprint шоу, и это точный выход я хочу

{'lat': '36.15900011', 'lon': '-115.17205183'} 
{'lat': '36.15899561', 'lon': '-115.17276155'} 

но гиперссылка http://127.0.0.1:8000/parser показывает {"lat": "36.15899561", "lon": "-115.17276155"} А может я знаю, почему?

+0

Вы не можете получить этот точный вывод, потому что это недействительно JSON. Действительным JSON должна быть одна вещь - число, объект, массив и т. Д. - не две отдельные вещи. Ближайшим к тому, что вы хотите, будет массив, в котором есть эти два объекта, но это не будет (или 'pprint' как) то же самое, что вы выводите. – abarnert

ответ

2

Назначение jsoninfo происходит за пределами цикла for, но в нем происходит назначение geoinfo. Вы должны объединить все geoloc.attrib значений в список и преобразовать его в формат JSON в конце:

def xml_parser(request): 
    infos = [] 

    for child in root.findall('GetAll'): 
     for geoloc in child.iter('loc'): 
      infos.append(geoloc.attrib) 

    jsoninfo = json.dumps(infos, ensure_ascii=False) 
    return HttpResponse(jsoninfo, content_type='application/json') 

Это подразумевает, что вы на самом деле предназначены для вывода одного объекта JSON в качестве ответа, вместо двух кодировок независимых объектов, разделенных символом новой строки.

+0

Конечно, это даст ему массив JSON с двумя объектами в нем, а не двумя отдельными объектами верхнего уровня, как он просил (потому что то, что он просил, недействителен JSON, так что выбора действительно нет, но сделать это путь). – abarnert

+0

Правильно, я предполагаю, что он на самом деле предназначен для вывода одного объекта JSON. –

+0

Ох ... это дает мне право? теперь на выходе есть '[{" lat ":" 36.15900011 "," lon ":" -115.17205183 "}, {" lat ":" 36.15899561 "," lon ":" -115.17276155 "}]', но похоже на мой jquery 'console.debug (r.jsoninfo.lat + ',' + r.jsoninfo.lon)' давая мне эту ошибку. 'r, jsoninfo undefined –

0

Вы переписываете geoinfo каждый раз в свою петлю. Вы не сохраняете все результаты. Рассмотрите возможность создания пустого списка, добавления к нему и отправки его в ответ