从JSON文件中解析值?

mic*_*ele 1400 python parsing json

我在文件中有这个JSON:

{
    "maps": [
        {
            "id": "blabla",
            "iscategorical": "0"
        },
        {
            "id": "blabla",
            "iscategorical": "0"
        }
    ],
    "masks": [
        "id": "valore"
    ],
    "om_points": "value",
    "parameters": [
        "id": "valore"
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

import json
from pprint import pprint

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

pprint(data)
Run Code Online (Sandbox Code Playgroud)

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

Jus*_*eel 2094

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

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

{
    "maps": [
        {
            "id": "blabla",
            "iscategorical": "0"
        },
        {
            "id": "blabla",
            "iscategorical": "0"
        }
    ],
    "masks": {
        "id": "valore"
    },
    "om_points": "value",
    "parameters": {
        "id": "valore"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

import json
from pprint import pprint

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

pprint(data)
Run Code Online (Sandbox Code Playgroud)

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

data["maps"][0]["id"]
data["masks"]["id"]
data["om_points"]
Run Code Online (Sandbox Code Playgroud)

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

  • 这就是为什么你的文本是unicode类型而不是字符串.大多数时候,最好在德国变音符号的unicode中使用文本,并与其他模块/程序等共享文本结果.所以你很好! (7认同)
  • 很好,但python在每个键之前添加一个'u'.知道为什么吗? (6认同)
  • 谢谢你的解决方案.我在打印时得到一个unicode符号.(例如u'valore').怎么预防呢? (5认同)
  • 我想提出一个希望对大家有帮助的观察结果,而且肯定具有讽刺意味。我发现pprint模块不如json模块漂亮打印json。如果您同时尝试它们,我想您会同意的。为了显示和调试我的json数据结构,我一直在做:output = json.dumps(data_structure,indent = 2,sort_keys = True)print(output)我想您会发现indent-control,sorting和smart在dumps()方法中进行换行非常符合您的喜好。如果我的想法是错误的,请让我知道。 (2认同)

Ben*_*ngt 305

data.json应该看起来像这样:

{
 "maps":[
         {"id":"blabla","iscategorical":"0"},
         {"id":"blabla","iscategorical":"0"}
        ],
"masks":
         {"id":"valore"},
"om_points":"value",
"parameters":
         {"id":"valore"}
}
Run Code Online (Sandbox Code Playgroud)

你的代码应该是:

import json
from pprint import pprint

with open('data.json') as data_file:    
    data = json.load(data_file)
pprint(data)
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于Python 2.6及更高版本,因为它取决于with-statement.在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'
Run Code Online (Sandbox Code Playgroud)

  • 我得到了一个downvote.也许不清楚,为什么我认为另一个答案是必要的.添加了有关with语句兼容性的说明. (7认同)

Gen*_*wen 66

Justin Peel的回答非常有用,但是如果你使用Python 3阅读JSON应该这样做:

with open('data.json', encoding='utf-8') as data_file:
    data = json.loads(data_file.read())
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案在没有时将整个文件读入内存,并建议在Python 3中JSON文件不能懒惰地读取,这是不真实的.对不起,但很明显是downvote. (28认同)
  • 为什么要避免使用`json.load`来支持Python 3中的`.loads`? (10认同)
  • 您链接的页面没有说明避免"加载". (10认同)
  • 这个答案不准确.在python3中没有理由不使用json.load和一个打开的文件处理程序.对于downvote感到抱歉,但您似乎并未仔细阅读上述评论. (10认同)
  • +1这个答案太棒了!谢谢你,并让我远离寻找可以使用字符串的函数,因为我只使用不是文件的字符串和网络请求! (5认同)
  • 这个答案有效,但是没有必要通过显式读取文件内容来转换为字符串,这样就可以使用json.loads了.使用json.load和类似文件的对象为您做这件事,是一个更好的解决方案. (2认同)

smb*_*aei 52

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

  • 在文件中使用多个json对象意味着文件本身实际上不是有效的json.如果要在json文件中包含多个对象,则它们应包含在文件顶层的数组中. (37认同)
  • 如果文件中有多个json对象,这是正确的解决方案.`json.loads`不解码多个json对象.否则,您会收到"额外数据"错误. (8认同)

moe*_*dol 12

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

您可以在Python包索引中找到ujson,并且API几乎与Python的内置json库相同.

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


sus*_*mit 7

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

{
  "connection1": {
    "DSN": "con1",
    "UID": "abc",
    "PWD": "1234",
    "connection_string_python":"test1"
  }
  ,
  "connection2": {
    "DSN": "con2",
    "UID": "def",
    "PWD": "1234"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这使文件句柄保持打开状态.使用`with`语句会更好 (16认同)

Bib*_*son 6

这种解析有两种类型。

  1. 从系统路径的文件中解析数据
  2. 从远程 URL 解析 JSON。

从文件中,您可以使用以下内容

import json
json = json.loads(open('/path/to/file.json').read())
value = json['key']
print(json['value'])
Run Code Online (Sandbox Code Playgroud)

这篇文章解释了使用两种场景的完整解析和获取值。使用 Python 解析 JSON


Job*_*ive 5

{
    "maps": [
        {
            "id": "blabla",
            "iscategorical": "0"
        },
        {
            "id": "blabla",
            "iscategorical": "0"
        }
    ],
    "masks": [{
        "id": "valore"
    }],
    "om_points": "value",
    "parameters": [{
        "id": "valore"
    }]
}
Run Code Online (Sandbox Code Playgroud)