Преобразования объекта в строку JSON


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

Есть много конкатенации строк, и я не слишком уверен, что лучший способ сделать это в Python.

Я также интересно, если АТР.заменить('"','\"') достаточно, чтобы санировать ввод.

def to_json_with_key(nodes, key, fields, insertIndex=False):
    i=0
    s="{"
    for node in nodes:
        s += '"%s":{' % getattr(node,key)
        attrs=[]
        for field in fields:
            attr = getattr(node,field)
            if not isinstance(attr,int) and not isinstance(attr,float) and not isinstance(attr,long):
                attrs.insert(0, '"%s":"%s"' % (field, attr.replace('"','\"') ))
            else:
                attrs.insert(0, '"%s":%s' % (field, attr ))

        if (insertIndex):
            s+='index:%d,' % i
            i=i+1

        s+=','.join(attrs) + "},"
    s = s.rstrip(",") + "}"
    return s

Образец ввода:

to_json_with_key(myObj, "title", fields=["length","time_offset"], insertIndex=True)

Пример вывода:

{"Introduction_to_Lists":{index:0,"length":128,"time_offset":0,
 "Pass_by_Reference":{index:1,"length":84,"time_offset":128}}


872
2
задан 9 октября 2011 в 05:10 Источник Поделиться
Комментарии
1 ответ

Во-первых, Python включает в себя модуля JSON. Пользуетесь им, а затем писать свой собственный.

Однако, просто чтобы дать некоторые комментарии на ваш стиль:

def to_json_with_key(nodes, key, fields, insertIndex=False):

питон рекомендуем words_with_underscores для имен параметров

    i=0

А потом держать вручную использовать граф перечислять

    s="{"
for node in nodes:
s += '"%s":{' % getattr(node,key)

Не проверять значение, чтобы убедиться, что он является JSON-безопасный. Струны здания путем конкатенации обычно не очень хорошая идея. Либо создать список и присоединиться к ней или использовать StringIO

        attrs=[]
for field in fields:
attr = getattr(node,field)
if not isinstance(attr,int) and not isinstance(attr,float) and not isinstance(attr,long):

Вы можете пройти несколько видов кортежа в isinstance для проверки нескольких видов сразу.

                attrs.insert(0, '"%s":"%s"' % (field, attr.replace('"','\"') ))

Этого не будет достаточно. Например, вы могли бы \ в конце строки. Вам также нужно обрабатывать переводы строк, табуляцию и другие экранированные символы.

            else:
attrs.insert(0, '"%s":%s' % (field, attr ))

Зачем вставлять, а потом добавлять?

        if (insertIndex):

Нет необходимости в скобки

            s+='index:%d,' % i
i=i+1

s+=','.join(attrs) + "},"
s = s.rstrip(",") + "}"

Чище было бы присоединиться к списку элементов, а затем срывания шальных запятые.

    return s

7
ответ дан 9 октября 2011 в 05:10 Источник Поделиться