题 从JSON文件解析值?


我在文件中有这个JSON:

{
    "maps": [
        {
            "id": "blabla",
            "iscategorical": "0"
        },
        {
            "id": "blabla",
            "iscategorical": "0"
        }
    ],
    "masks": [
        "id": "valore"
    ],
    "om_points": "value",
    "parameters": [
        "id": "valore"
    ]
}

我写了这个打印所有json文本的脚本:

json_data=open(file_directory).read()

data = json.loads(json_data)
pprint(data)

如何解析文件并提取单个值?


1109
2018-05-14 15:54


起源


也可以看看: 读写JSON的示例 - Martin Thoma
我在github上创建了一个小型存储库,它显示了它是如何做到的: github.com/burlachenkok/json_processing。我昨天创建了一个答案,但它被标记为已删除,因为它链接到另一个地方 - bruziuz


答案:


我想Ignacio所说的是你的JSON文件不正确。你有 [] 什么时候应该 {}[] 是列表, {} 是为词典。

以下是您的JSON文件的外观,您的JSON文件甚至不会为我加载:

{
    "maps": [
        {
            "id": "blabla",
            "iscategorical": "0"
        },
        {
            "id": "blabla",
            "iscategorical": "0"
        }
    ],
    "masks": {
        "id": "valore"
    },
    "om_points": "value",
    "parameters": {
        "id": "valore"
    }
}

然后你可以使用你的代码:

import json
from pprint import pprint

with open('data.json') as f:
    data = json.load(f)

pprint(data)

使用数据,您现在还可以找到如下值:

data["maps"][0]["id"]
data["masks"]["id"]
data["om_points"]

尝试一下,看看它是否有意义。


1667
2018-05-14 16:10



好的,所以我必须控制我的代码,因为这个json文件是从java对象生成的。谢谢。 - michele
实际上,我认为你应该在答案中使用'with'。我仍然给了+1,因为我认为它对新手来说很有价值。 - lpapp
谢谢你的解决方案。我打印时会得到一个unicode符号。 (例如u'valore')。怎么预防呢? - diaryfolio
不错但python增加了一个 u' 每把钥匙之前。知道为什么吗? - CodyBugstein
这就是为什么你的文本是unicode类型而不是字符串的原因。大部分时间最好是在德国变形金刚的unicode中使用文本,并与其他模块/程序等共享文本结果。所以你很好! - Michael P


你的 data.json 应该是这样的:

{
 "maps":[
         {"id":"blabla","iscategorical":"0"},
         {"id":"blabla","iscategorical":"0"}
        ],
"masks":
         {"id":"valore"},
"om_points":"value",
"parameters":
         {"id":"valore"}
}

你的代码应该是:

import json
from pprint import pprint

with open('data.json') as data_file:    
    data = json.load(data_file)
pprint(data)

请注意,这仅适用于Python 2.6及更高版本,因为它取决于 with-声明。在Python 2.5中使用 from __future__ import with_statement,在Python <= 2.4中,请参阅 Justin Peel的回答,这个答案是基于。

您现在还可以访问单个值,如下所示:

data["maps"][0]["id"]  # will return 'blabla'
data["masks"]["id"]    # will return 'valore'
data["om_points"]      # will return 'value'

270
2017-11-29 20:10



我得到了一个downvote。也许不清楚,为什么我认为另一个答案是必要的。添加了有关with语句兼容性的说明。 - Bengt
很抱歉回滚,但建议的代码将保留 data_file  open超过必要的时间。 - Bengt
参考2.6文档(docs.python.org/2.6/library/io.html),在“with”上下文中打开一个文件会自动关闭该文件。 - Steve S.
@SteveS。是的,但不在上下文之前。 pprint进入 with-context保持 data_file 开得更久。 - Bengt
@GayanPathirage你可以像访问它一样 data["om_points"] , data["masks"]["id"]。我们的想法是,您可以通过指定“关键路径”来达到字典中的任何级别。如果你得到了 KeyError 异常表示路径中不存在密钥。注意拼写错误或检查字典的结构。 - Nuhman


@Justin Peel的回答非常有用,但如果您使用的是Python 3,那么JSON应该像这样完成:

with open('data.json', encoding='utf-8') as data_file:
    data = json.loads(data_file.read())

注意:使用 json.loads 代替 json.load。在Python 3中, json.loads 采用字符串参数。 json.load 采用类似文件的对象参数。 data_file.read() 返回一个字符串对象。


61
2018-05-22 03:44



为什么要 json.load 避免支持 .loads 在Python 3? - Zearin
您链接的页面没有说明有关避免的任何内容 load。 - Dan Hulme
这个答案在没有时将整个文件读取到内存中,并建议在Python 3中JSON文件不能被懒惰地读取,这是不真实的。对不起,但很明显是downvote。 - Łukasz Rogalski
这个答案不准确。没有理由不在python3中使用json.load和一个打开的文件处理程序。对于downvote感到抱歉,但您似乎并未仔细阅读上述评论。 - dusktreader
+1这个答案太棒了!谢谢你,并让我远离寻找可以使用字符串的函数,因为我只使用不是文件的字符串和网络请求! - newpeople


data = []
with codecs.open('d:\output.txt','rU','utf-8') as f:
    for line in f:
       data.append(json.loads(line))

47
2018-05-12 20:47



如果文件中有多个json对象,这是正确的解决方案。 json.loads 不解码多个json对象。否则,您会收到“额外数据”错误。 - yasin_alm
这是最好的答案。否则,它会给出“额外数据”错误。 - Earthx9
在文件中使用多个json对象意味着文件本身实际上不是有效的json。如果要在json文件中包含多个对象,则它们应包含在文件顶层的数组中。 - dusktreader


“Ultra JSON”或简称“ujson”可以处理 [] 在您的JSON文件输入中。如果您正在将JSON输入文件作为JSON元素列表读入程序中;如, [{[{}]}, {}, [], etc...] ujson可以处理任何字典列表,列表字典的任意顺序。

你可以找到ujson Python包索引 并且API几乎与Python的内置相同 json 图书馆。

如果你加载更大的JSON文件,ujson也会快得多。与提供的同一链接中的其他Python JSON库相比,您可以查看性能详细信息。


11
2018-03-09 21:38





如果您在python 3中,那么您将如何做到这一点

{
  "connection1": {
    "DSN": "con1",
    "UID": "abc",
    "PWD": "1234",
    "connection_string_python":"test1"
  }
  ,
  "connection2": {
    "DSN": "con2",
    "UID": "def",
    "PWD": "1234"
  }
}

代码应该看起来像假设connection.json文件如上所示

connection_file = open('connection.json', 'r')
conn_string = json.load(connection_file)
conn_string['connection1']['connection_string_python'])
connection_file.close()
>>>test1

6
2018-04-25 17:42



这也适用于2.7.5 - siddardha
这使文件句柄保持打开状态。用一个 with 声明会更好 - Corey Goldberg


   # Here you go with modified json file:
   # data.json file : 
    {
        "maps": [
            {
                "id": "blabla",
                "iscategorical": "0"
            },
            {
                "id": "blabla",
                "iscategorical": "0"
            }
        ],
        "masks": [{
            "id": "valore"
        }],
        "om_points": "value",
        "parameters": [{
            "id": "valore"
        }]
    }


   # You can call or print data on console by using below lines

    import json
    from pprint import pprint
    with open('data.json') as data_file:
        data_item = json.load(data_file)
    pprint(data_item)

    print(data_item['parameters'][0]['id'])

    #Output : 
    #pprint(data_item) output as :

    {'maps': [{'id': 'blabla', 'iscategorical': '0'},
              {'id': 'blabla', 'iscategorical': '0'}],
     'masks': [{'id': 'valore'}],
     'om_points': 'value',
     'parameters': [{'id': 'valore'}]}
    #print(data_item['parameters'][0]['id']) output as :
    valore

4
2017-11-07 01:53



如果我们想要添加一列来计算“地图”有多少观察,我们怎么能写这个函数? - Chenxi