我一直在试图找出一个在Python中加载JSON对象的好方法。 我发送这个json数据:

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}

到后端,它将作为一个字符串接收,然后我使用json.loads(数据)来解析它。

但每次我都得到相同的异常:

ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

我谷歌了一下,但似乎没有什么工作,除了这个解决方案json.loads(json.dumps(data)),这对我个人来说似乎不是那么有效,因为它接受任何类型的数据,甚至那些不是json格式的数据。

任何建议都将不胜感激。


当前回答

json语法要求每个“键”和“值”都使用引号。这使得它成为一种非常健壮的数据格式。在下面的例子中,我使用颜色和颜色作为键:

{"colors":[
  {
     "color":"red",
     "value":"#f00"
  },
  {
     "color":"green",
     "value":"#0f0"
  },
  {
     "color":"blue",
     "value":"#00f"
  },
  {
     "color":"cyan",
     "value":"#0ff"
  },
  {
     "color":"magenta",
     "value":"#f0f"
  },
  {
     "color":"yellow",
     "value":"#ff0"
  },
  {
     "color":"black",
     "value":"#000"
  }]}

其他回答

正如其他答案所解释的那样,错误发生是因为传递给json模块的无效引号字符。

在我的情况下,我继续得到ValueError,即使在替换'与'在我的字符串。我最终意识到,一些类似引号的unicode符号已经进入了我的字符串:

 “  ”  ‛  ’  ‘  `  ´  ″  ′ 

要清除所有这些,你可以通过一个正则表达式传递你的字符串:

import re

raw_string = '{“key”:“value”}'

parsed_string = re.sub(r"[“|”|‛|’|‘|`|´|″|′|']", '"', my_string)

json_object = json.loads(parsed_string)

你可以使用json5包https://pypi.org/project/json5/而不是json包。这个包可以处理单引号。解码函数是json5.loads(data),类似于json包。

下面的代码片段将有助于将数据转换为JSON。所有单引号都应该转换为双引号以jsonify数据。

data = {
"http://example.org/about": {
    "http://purl.org/dc/terms/title": [{
        "type": "literal",
        "value": "Anna's Homepage"
    }]
}}
parsed_data = data.replace("'", '"')
data_json = json.loads(parsed_data)

我有这个错误试图规范化嵌套的JSON列在熊猫。正如@Reihan_amn所指出的,将所有单引号替换为双引号可能会影响实际内容。因此,当得到这个错误时,您应该只替换JSON语法中的“that are where”。你可以用下面的正则表达式来实现:

import re
import json

invalid_json = """{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}"""

valid_json = re.sub( "(?<={)\'|\'(?=})|(?<=\[)\'|\'(?=\])|\'(?=:)|(?<=: )\'|\'(?=,)|(?<=, )\'", "\"", invalid_json)

print(json.loads(valid_json))

如果唯一的问题是在原始格式错误的JSON文档中,双引号(")应该出现的地方出现了单引号('),那么这就足够了。但是,如果文档中的某个地方出现了双引号,而这些双引号也不是JSON语法的一部分,那么您仍然会得到一个错误。在这种情况下,我建议4步解决方案:

将所有作为JSON语法一部分的双引号替换为单引号(与上面的正则表达式类似,但交换了' and ')。 将所有(剩余的)双引号替换为文档中不存在的特殊字符,例如:' '。你可以用re.sub("\"", " ' ' ", x)。 使用上面给出的正则表达式,将JSON中应该是双引号的所有单引号替换为双引号。

你现在可以加载JSON文档,并通过pd.json_normalize(df["json_col"].apply(JSON .loads))将其读入Pandas DataFrame。

如果您愿意,您可以将所有' '(或您选择的特殊字符)替换回"。

对于任何想要快速修复的人来说,这只是将所有单引号替换为双引号:

import json 

predictions = []

def get_top_k_predictions(predictions_path):
    '''load the predictions'''
    
    with open (predictions_path) as json_lines_file:
        for line in json_lines_file:
            predictions.append(json.loads(line.replace("'", "\"")))
            
    
get_top_k_predictions("/sh/sh-experiments/outputs/john/baseline_1000/test_predictions.jsonl")