【问题标题】:Working with JSON in Python 2.6?在 Python 2.6 中使用 JSON?
【发布时间】:2010-12-16 02:09:46
【问题描述】:

我对 Python 很陌生,但我选择了一个与工作实际相关的问题,我想当我弄清楚如何去做时,我会一路学习。

我有一个充满 JSON 格式文件的目录。我已经将目录中的所有内容导入到一个列表中,并遍历该列表以进行简单的打印以验证我是否获得了数据。

我试图弄清楚如何在 Python 中实际使用给定的 JSON 对象。在javascript中,它就像

一样简单
var x = {'asd':'bob'}
alert( x.asd ) //alerts 'bob'

访问对象的各种属性是简单的点符号。 Python 的等价物是什么?

这是我正在执行导入的代码。我想知道如何处理存储在列表中的各个对象。

#! /usr/local/bin/python2.6

import os, json

#define path to reports
reportspath = "reports/"

# Gets all json files and imports them

dir = os.listdir(reportspath)

jsonfiles = []

for fname in dir:
    with open(reportspath + fname,'r') as f:
        jsonfiles.append( json.load(f) )

for i in jsonfiles:
    print i #prints the contents of each file stored in jsonfiles

【问题讨论】:

标签: python json


【解决方案1】:

当您json.load 一个包含 Javascript 对象的 JSON 形式的文件(例如 {'abc': 'def'})时,您会得到一个 Python dictionary(通常被亲切地称为 dict)(在这种情况下恰好有与 Javascript 对象相同的文本表示)。

要访问特定项目,您使用索引,mydict['abc'],而在 Javascript 中,您将使用属性访问表示法,myobj.abc。在 Python 中使用属性访问表示法得到的是可以在 dict 上调用的方法,例如 mydict.keys() 将给出 ['abc'],一个包含字典中所有键值的列表(在这种情况下,只有一个,它是一个字符串)。

字典的功能极其丰富,有丰富的方法会让你头晕目眩,加上对许多 Python 语言结构的强大支持(例如,你可以在 dict 上循环,for k in mydict:k 将步进通过字典的键,迭代和顺序)。

【讨论】:

  • 有没有简单的方法来漂亮地打印一个 json 对象,只显示键而不显示数据?很容易看到这样一个对象的关键结构
  • 好吧,一旦你加载它,它就不是一个真正的 json 对象......它是一个字典。但无论如何尝试“打印 mydict.keys()”
  • 进口印刷品; pprint.pprint(mydict.keys())
  • ... 这只是一个键列表,所以 pprint 没有给你任何额外的东西:p
【解决方案2】:

要访问所有属性,请在追加列表之前尝试 eval() 语句。

喜欢:

import os

#define path to reports
reportspath = "reports/"

# Gets all json files and imports them

dir = os.listdir(reportspath)


for fname in dir:
    json = eval(open(fname).read())
    # now, json is a normal python object
    print json
    # list all properties...
    print dir(json)

【讨论】:

  • 这行得通,如果您在结果对象上使用repr(),您将再次获得 JSON。然而!使用 JSON 库要好得多; eval() 是一个可怕的安全漏洞;如果您从 Internet 下载一些 JSON,它可能包含危险代码。您可以将原生 Python 内容放入您的 dict 中,repr() 可能会以混淆 JSON 的方式进行字符串化;例如,如果您在 dict 中放置一个元组,则结果将不是合法的 JSON。 (JSON 有列表,在方括号“[]”中,但在括号中没有元组。)
  • 感谢 cmets。 “eval() 是一个可怕的安全漏洞”是的!如果来源不安全。
  • 不使用“eval”怎么办,应该使用哪种 JSON 方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
相关资源
最近更新 更多