Actualmente estoy escribiendo una respuesta de API y el requisito es que todos los enteros deben estar entre comillas dobles. Ex:

{
"Key1": {"SubKey1":"1", "SubKey2":"2"},
"Key2": "2"
}

Cuando uso json.dumps () para convertir mi dict a json str obtengo este resultado:

{
"Key1": {"SubKey1":1, "SubKey2":2},
"Key2":2
}

(los valores de las claves son objetos int en python). ¿Qué debo hacer para que los valores aparezcan entre comillas?

He intentado lanzarlos usando

string_ver = {str(key): str(d[key]) for key in d}

Pero esto no convirtió los valores de la subclave en cadenas (como se esperaba)

0
Harsha 12 may. 2020 a las 23:01

5 respuestas

Gracias a @pyOliv y @robinsax, encontré la solución.

def recursive_change_int_to_string(dictObj):
for key, val in dictObj.items():
    if isinstance(val, dict):
        recursive_change_int_to_string(val)
    elif isinstance(val, int):
        dictObj[key] = str(val)

Y entonces

sampleDict = {"Key1": {"SubKey1":1, "SubKey2":2}, "Key2":2 }

recursive_change_int_to_string(sampleDict)

json.dumps(sampleDict )

Me dio:

{
"Key1": {"SubKey1":"1", "SubKey2":"2"},
"Key2": "2"
}
0
Harsha 12 may. 2020 a las 21:01

Los enteros en su diccionario de Python se representarán como enteros en el JSON. Si quieres que sean cadenas, conviértelas en cadenas en Python:

>>> import json
>>> json.dumps({'thing': str(2)})
'{"thing": "2"}'
0
ForceBru 12 may. 2020 a las 20:05

Para el registro, la razón por la que obtiene respuestas que no funcionan es que no proporcionó una buena pieza de datos de muestra. Debe asegurarse de que su entrada de muestra siempre coincida con la forma de su entrada real al publicar.

Dicho esto, la recursividad es tu amiga aquí. La siguiente función devolverá una copia del dict proporcionado con todos los valores convertidos en cadena, manejando una profundidad de anidación arbitraria. Si data contiene listas, se requerirán más modificaciones.

def cast_values_to_str(data):
    result = dict()
    for key, value in data.items():
        if isinstance(value, dict):
            result[key] = cast_values_to_str(value)
        else:
            result[key] = str(value)
    return result
1
robinsax 12 may. 2020 a las 20:22

EDITADO: Debe convertir recursivamente cada int en cadenas:

def convert_simple_dct(dct):
    for key, val in dct.items():
        if isinstance(val, dict):
            dct[key] = convert_simple_dct(val)
        else:
            dct[key] = str(val)
    return dct

dct = {
    "Key1": {"SubKey1":1, "SubKey2":2},
    "Key2": 2
}
print(json.dumps(convert_simple_dct(dct)))
1
pyOliv 12 may. 2020 a las 20:23

No puedo reproducir, cuando ejecuto este código:

In [1]: import json                                                                                                                                                                                                                                                
In [2]: mydict= {"Key1": "1", "Key2": "2"}                                                                                                                                                                                                                         
In [3]: json.dumps(mydict)                                                                                                                                                                                                                                         
Out[3]: '{"Key1": "1", "Key2": "2"}'
0
user2466962 12 may. 2020 a las 20:08