динамический словарь для проблемы JSON - PullRequest
0 голосов
/ 29 марта 2011

В настоящее время я работаю над проектом с использованием javascript и python с плагином Jquery Datatables и Django. Моя проблема в том, что я пытаюсь создать словарь в Python, который затем я хочу выполнить json.dumps (словарь), чтобы отправить его в JQuery.

Преобразование выполнено, и я могу с помощью отладчика просмотреть данные в коде JQuery / Javascript, однако он не заполняет мою таблицу, поскольку JSON искажен. Я считаю, что это связано с тем, как создается словарь в коде Python. Я знаю, что делаю что-то не так на этом этапе. Все примеры, которые я видел, показывают жестко закодированный словарь, который мне нужен для динамического создания словаря. Вот код, который я использую в Python. Если кто-то знает, что я делаю неправильно, пожалуйста, дайте мне знать, что это сводит меня с ума. Это последняя перестановка словарного кода: -

    dictionary = {}
    array = []
    status = 'OFF'
    for item in self.scanResults:
        if item[6]:
            status = 'ON'
        else:
            status = 'OFF'

        array.append( {'MAC_ADDRESS':item['mac_addr'],
                    'IP_ADDRESS':item['ip_addr'],
                    'NAME':item['name'],
                    'OS':item['os'],
                    'OS_VERSION':item['os_version'],
                    'WORKGROUP':'--',
                    'STATUS':status
        })
    dictionary = dict({'aaData': array})    

JSON на стороне JQuery должен иметь следующий формат: -

{"aaData": [[..,..,..,..,],[..,..,..,..]]}

Приветствия за любую помощь, которую вы можете предоставить

Chris

EDIT:

Дополнительная информация. Извините, что не включил его раньше. Я кодирую это следующим образом: -

return HttpResponse (simplejson.dumps (response_dict), mimetype = 'application / javascript')

Дамп результатов на экране: -

{"aaData": [{"STATUS": "ON", "WORKGROUP": "-", "IP_ADDRESS": "192.168.0.2", "OS_VERSION": "8.04", "MAC_ADDRESS": " 00: 10: e3: 42: 16: 35 "," OS ":" Linux "," NAME ":" Machine_One "}, {" STATUS ":" ON "," WORKGROUP ":" - "," IP_ADDRESS ":" 192.168.0.3 "," OS_VERSION ":" 8.04 "," MAC_ADDRESS ":" 00: 19: a3: 41: 16: 31 "," OS ":" Linux "," NAME ":" Machine_Two "} , {"STATUS": "ON", "WORKGROUP": "-", "IP_ADDRESS": "192.168.0.4", "OS_VERSION": "8.04", "MAC_ADDRESS": "00: 19: b3: 43: 16:32 "," OS ":" Linux "," NAME ":" Machine_Three "}, {" STATUS ":" ON "," WORKGROUP ":" - "," IP_ADDRESS ":" 192.168.0.5 ", "OS_VERSION": "8.04", "MAC_ADDRESS": "00: 19: c3: 44: 16: 33", "OS": "Linux", "NAME": "Machine_Four"}, {"STATUS": "ON "," WORKGROUP ":" - "," IP_ADDRESS ":" 192.168.0.6 "," OS_VERSION ":" 8.04 "," MAC_ADDRESS ":" 00: 19: d3: 45: 16: 34 "," OS " : "Linux", "NAME": "Machine_Five"}, {"STATUS": "ON", "WORKGROUP": "-", "IP_ADDRESS": "192.168.0.7", "OS_VERSION": "8.04", "MAC_ADDRESS": "00: 19: e3: 46: 16: 37", "OS": "Linux", "NAME": "Machine_Six"}, {"STAT US ":" ON "," WORKGROUP ":" - "," IP_ADDRESS ":" 192.168.0.8 "," OS_VERSION ":" 8.04 "," MAC_ADDRESS ":" 00: 19: f3: 47: 16: 38 "," OS ":" Linux "," NAME ":" Machine_Seven "}, {" STATUS ":" ON "," WORKGROUP ":" - "," IP_ADDRESS ":" 192.168.0.9 "," OS_VERSION " : "8.04", "MAC_ADDRESS": "00: 19: g3: 48: 16: 38", "OS": "Linux", "NAME": "Machine_Eight"}, {"STATUS": "ON", " WORKGROUP ":" - "," IP_ADDRESS ":" 192.168.0.10 "," OS_VERSION ":" 8.04 "," MAC_ADDRESS ":" 00: 19: h3: 49: 16: 41 "," OS ":" Linux "," NAME ":" Machine_Nine "}]}

Фактические ожидаемые результаты будут: -

{"aaData": [["ON", "-", "192.168.0.6", "8.04", "00: 19: d3: 45: 16: 34", "Linux", "Machine_Five" ], ["ON", "-", "192.168.0.6", "8.04", "00: 19: d3: 45: 16: 34", "Linux", "Machine_Five"]]} Просто чтобы дать вам представление.

Для этого я использую плагин jQuery DataTables. Я считаю, что проблема в неправильном словаре, т. Е. Моя вина. Я новичок в python, пробовал многочисленные перестановки словарей и обнаружил более 10 способов не делать этого, мне просто нужен намек на этот неуловимый правильный путь.

Ура снова

Chris

РЕШИТЬ:

Я решил проблему, передав обратно с сервера массив массивов (список списков), если вы предпочитаете, и анализируя их на стороне клиента из-за фиксированного размера списков, это не вызывает проблем с производительностью. Я рассмотрим это более подробно позже и опубликую лучшее решение или более элегантное решение.

Ответы [ 4 ]

2 голосов
/ 29 марта 2011

Если он уродлив, значит, ты уродлив. Возможно, вы имели в виду:

    array.append([item['mac_addr'],
                item['ip_addr'],
                item['name'],
                item['os'],
                item['os_version'],
                '--',
                status
    ])
0 голосов
/ 29 марта 2011

array.append([item['mac_addr'], # note: we are appending array.
              item['ip_addr'],
              item['name'],
              item['os'],
              item['os_version'],
              '--',
              status
            ])

при сериализации вы получаете данные в следующем формате.
[["xxx", "yyy", "zzz"], ["xx1", "yy1", "zz1"]]
положить это в словарь, словарь = {'aaData': массив}

0 голосов
/ 29 марта 2011

"Ожидаемые данные" выглядят как ПЯТЬ элементов в СПИСОК (в довольно неожиданном, т. Е. Зашифрованном порядке); вы набиваете СЕМЬ предметов в DICT - ПОЧЕМУ ??

Take 2 (с учетом вашего необъявленного редактирования):

"ожидаемые данные", по-видимому, равны семи в LIST (в довольно неожиданном, т. Е. В зашифрованном порядке); Вы вводите семь ключевых: ценностей в DICT - ПОЧЕМУ ??

Вы уверены, что ожидаемый список данных должен быть в таком зашифрованном порядке?

0 голосов
/ 29 марта 2011

Код в вашем вопросе не содержит ключевой бит, который мы должны увидеть - как вы сериализуете свой словарь в строку.Если вы просто делаете str(dictionary), тогда это не сработает, вам нужно закодировать его с помощью simplejson.Вы можете установить эту библиотеку с помощью easy_install или, если вы используете Python 2.6+, тогда она включена как json.

Для кодирования объекта Python в виде строки JSON просто используйте json.dumps(dictionary).

Вы говорите, что ваш код Javascript ожидает объект, содержащий вложенные списки, но ваш код Python, кажется, генерирует объект, подобный {"aaData": [{..:.., ..:..},{..:.., ..:..}]}, то есть словарь, внутри списка, внутри словаря.Если проблема не в том, как вы кодируете строку JSON, то вы можете понять, какой объект вы ожидаете?

EDIT

Как Игнасио Васкес-Абрамсв вашем коде Python вы добавляете словари в список, а затем ожидаете, что они волшебным образом преобразуются в списки, когда они закодированы как JSON.Вам нужно либо конвертировать Javascript для работы с данными, которые вы отправляете в данный момент, либо заменить текущий код Python чем-то похожим на то, что предлагает Игнасио.Легко ошибиться при использовании списка для представления структуры, и вы в конечном итоге будете использовать неправильное значение, потому что у вас неверные индексы.Если вы сохраняете его как словарь / объект, вы можете получить доступ к вещам по имени и избежать этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...