我一直在试图找出一个在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片段,所使用的双引号在某种程度上是一个不同的、无法识别的双引号字符。我的文件在替换双引号后是有效的JSON。

其他回答

使用eval函数。

它处理单引号和双引号之间的差异。

在我的例子中,双引号不是问题。

最后一个逗号给了我同样的错误信息。

{'a':{'b':c,}}
           ^

为了删除这个逗号,我写了一些简单的代码。

import json

with open('a.json','r') as f:
    s = f.read()
    s = s.replace('\t','')
    s = s.replace('\n','')
    s = s.replace(',}','}')
    s = s.replace(',]',']')
    data = json.loads(s)

这对我很有效。

你输入的似乎是一个有效的(亚马逊)离子,虽然不是json。在这种情况下,您应该能够将其解析为ion,然后将其输出为json。

single_quote_json = {'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}
    
import amazon.ion.simpleion as ion
from amazon.ion.json_encoder import IonToJSONEncoder

parsed_ion = ion.loads(str(single_quote_json))
json.dumps(parsed_ion, cls=IonToJSONEncoder)

输出:

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

参考:Amazon Ion上的文档:https://amzn.github.io/ion-docs/guides/cookbook.html#down-converting-to-json

这样的:

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

不是JSON。 这样的:

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

是JSON。

编辑: 一些评论者认为,上述内容还不够。 JSON规范- RFC7159规定字符串以引号开始和结束。这就是“。 单引号在JSON中没有语义意义,只允许在字符串中使用。

我有同样的问题,我所做的是用双引号替换单引号,但更糟糕的是,当我有一个逗号的json对象的最后一个属性时,我有同样的错误。因此,在使用json.loads()函数之前,我使用python中的regex来替换它。(注意“loads”后面的s)

import re

with open("file.json", 'r') as f:
     s = f.read()
     correct_format = re.sub(", *\n *}", "}", s)
     data_json = json.loads(correct_format)

使用的正则表达式返回每个逗号后跟换行符和“}”,用“}”替换它。