python work Json.loads può ignorare le virgole finali?




work with json in python (3)

Puoi racchiudere il parser json di python con jsoncomment

JSON Comment consente di analizzare file o stringhe JSON con:

  • Commenti di riga singola e multipla
  • Stringhe di dati a più linee
  • Virgola finale in oggetti e matrici, dopo l'ultimo elemento

Esempio di utilizzo:

import json
from jsoncomment import JsonComment

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

Come menzionato in questa domanda StackOverflow , non è possibile avere virgole finali in json. Ad esempio, questo

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

va bene, ma questo

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

è una sintassi non valida

Per le ragioni menzionate in questa altra domanda di StackOverflow , l'uso di una virgola finale è legale (e forse incoraggiato?) Nel codice Python. Sto lavorando con Python e JSON, quindi mi piacerebbe essere coerente con entrambi i tipi di file. C'è un modo per far json.loads che json.loads ignori le virgole finali?


In python è possibile avere virgole finali all'interno di dizionari ed elenchi, quindi dovremmo essere in grado di avvantaggiarsene 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"}'

Tuttavia, JSON non è esattamente python, quindi ci sono alcuni casi limite per questo. Ad esempio, valori come null, true, false non esistono in python. Possiamo sostituire quelli con equivalenti python validi prima di eseguire l'eval:

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))

Questo sfortunatamente mancherà qualsiasi stringa che abbia le parole null, true o false in esse.

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

potrebbe diventare

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

Striscia le virgole prima di passare il valore in.

import re

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

    return string






python-2.7