【问题标题】:Troubleshoot JSON Parsing/Adding PropertyJSON 解析/添加属性疑难解答
【发布时间】:2017-02-17 14:06:08
【问题描述】:

我有一个 json,它的前几行是:

{
"type": "Topology",
"objects": {
    "counties": {
        "type": "GeometryCollection",
        "bbox": [-179.1473399999999, 17.67439566600018, 179.7784800000003, 71.38921046500008],
        "geometries": [{
                    "type": "MultiPolygon",
                    "id": 53073,
                    "arcs": [
                        [
                            [0, 1, 2]
                        ]
                    ]
                },

我根据这些数据构建了一个 python 字典,如下所示:

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

这是一个很长的 json(美国的每个县)。然而,当我运行时:len(data) 它返回 4。我对此有点困惑。所以我开始进一步探索和探索数据:

data['id']
data['geometry']

两者都返回关键错误。但是我知道这个 json 文件是为这些属性定义的。事实上,这就是 json 的全部内容,它是每个县“id”的 id 和每个县“几何”的一系列多边形坐标。输入data 确实会返回整个json,我可以通过这种方式查看属性,但这并没有太大帮助。

我的最终目的是在 json 文件中添加一个属性,有点类似这样:

Add element to a json in python

不同之处在于我添加了一个来自 tsv 的属性。如果您想了解所有详细信息,可以在这里找到我的 json 和 tsv:

https://gist.github.com/diggetybo/ca9d3c2fed76ddc7185cf966a65b8718

为了清楚起见,让我总结一下我在问什么:

我的问题是:为什么我不能以上述方式访问属性?有人可以提供一种访问我感兴趣的属性的方法('id','geometries')或者更好的是,演示如何添加属性?

谢谢

【问题讨论】:

    标签: python json


    【解决方案1】:

    json.load

    反序列化 fp(一个支持 .read() 的类文件对象,其中包含一个 JSON 文档)到 Python 对象 使用此转换表。

    [] 用于列表,{} 用于字典。所以这是获取id 的示例:

    with open("us.json") as f:
        c=json.load(f)
        for i in  c["objects"]["counties"]["geometries"]:
            print i["id"]
    

    你的数据结构是这样的:

       { 
          "type":"xx",
          "objects":"xx",
          "arcs":"xx",
          "transform":"xx"
        }
    

    所以data 的长度为4。您可以像使用listdict 一样追加数据或添加新元素。查看Json 的更多详细信息。

    希望这会有所帮助。

    【讨论】:

    • 文档真的让我很困惑,感谢您澄清这一点。使用您的示例,我可以使用:data['objects']['counties']['geometries'][0]['id'] 分割成一个“id”。这对我来说是一大步。假设我将 tsv 加载为 data2 并且我想将名称添加到 json 中。我可以使用data['objects']['counties']['geometries']['name']=data2['name']吗?
    • 或者 for 循环也是添加到 json 的最佳方式吗?
    • 让我们试着简化一下。如果你想在每个字典或列表中添加一些元素,你应该使用循环,如果不是你可以在列表中添加一个新元素。data['objects']['counties']['geometries']是一个列表,所以你可以追加元素,但data['objects']['counties']['geometries'][0]是列表的一个元素,它是一个字典,所以你可以添加name作为键并设置一个像data['objects']['counties']['geometries'][0]['name']="Mike"这样的值
    • @ArashHowaida 我建议您阅读Python datastructures 并尝试一下。
    猜你喜欢
    • 2017-10-22
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2014-08-29
    • 2011-10-27
    相关资源
    最近更新 更多