¿Puede json.loads ignorar las comas finales?

Como se mencionó en esta pregunta de StackOverflow , no se le permite tener comas finales en json. Por ejemplo, este

{ "key1": "value1", "key2": "value2" } 

esta bien, pero esto

 { "key1": "value1", "key2": "value2", } 

No es válida la syntax.

Por las razones mencionadas en esta otra pregunta de StackOverflow , usar una coma al final es legal (¿y tal vez recomendable?) En el código de Python. Estoy trabajando con Python y JSON, por lo que me encantaría poder ser coherente en ambos tipos de archivos. ¿Hay alguna manera de que json.loads ignore las comas al final?

Puedes envolver el analizador json de python con jsoncomment

JSON Comment permite analizar archivos o cadenas JSON con:

  • Comentarios de línea única y múltiple
  • Cadenas de datos multilínea
  • Arrastrar comas en objetos y matrices, después del último elemento

Ejemplo de uso:

 import json from jsoncomment import JsonComment with open(filename) as data_file: parser = JsonComment(json) data = parser.load(data_file) 

Pele las comas antes de pasar el valor en.

 import re def clean_json(string): string = re.sub(",[ \t\r\n]+}", "}", string) string = re.sub(",[ \t\r\n]+\]", "]", string) return string 

En Python puedes tener comas finales dentro de los diccionarios y las listas, así que deberíamos poder aprovechar esto usando ast.literal_eval :

 import ast, json str = '{"key1": "value1", "key2": "value2",}' python_obj = ast.literal_eval(str) # python_obj is {'key1': 'value1', 'key2': 'value2'} json_str = json.dumps(python_obj) # json_str is '{"key1": "value1", "key2": "value2"}' 

Sin embargo, JSON no es exactamente python, por lo que hay algunos casos de borde en esto. Por ejemplo, valores como null, true, false no existen en python. Podemos reemplazar aquellos con equivalentes de python válidos antes de ejecutar la evaluación:

 import ast, json def clean_json(str): str = str.replace('null', 'None').replace('true', 'True').replace('false', 'False') return json.dumps(ast.literal_eval(str)) 

Lamentablemente, esto estropeará cualquier cadena que tenga las palabras null, true o false en ellas.

 {"sentence": "show your true colors"} 

se convertiría

 {"sentence": "show your True colors"}