Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Json组织_Python_Json - Fatal编程技术网

Python Json组织

Python Json组织,python,json,Python,Json,我的一个项目使用JSON。例如,我有JSON结构 { "address":{ "streetAddress": { "aptnumber" : "21", "building_number" : "2nd", "street" : "Wall Street", }, "city":"New York" },

我的一个项目使用JSON。例如,我有JSON结构

{
    "address":{
        "streetAddress": {
                  "aptnumber" : "21",
                  "building_number" : "2nd", 
                  "street" : "Wall Street",
            },
        "city":"New York"
    },
    "phoneNumber":
    [
        {
            "type":"home",
            "number":"212 555-1234"
        }
    ]
}
现在我有一堆使用这种结构的模块,它希望在收到的json中看到某些字段。对于上面的示例,我有两个文件:地址管理器和电话号码管理器。将向每个人传递相关信息。所以address_经理希望dict具有“streetAddress”和“city”键

我的问题是:是否可以设置一个常量结构,以便每次更改JSON结构中某个字段的名称(例如,我想将“streetAddress”更改为“address”),都不必在多个地方进行更改

我天真的方法是拥有一堆常量(例如。
ADDRESS=“地址”
地址\u STREET\u ADDRESS=“streetAddress”
等 )因此,如果我想更改JSON结构中某个字段的名称,我只需要在一个地方进行更改。然而,这似乎效率很低,因为一旦到达JSON结构的第三层或第四层(例如ADDRESS_STREETADDRESS_APTNUMBER、ADDRESS_STREETADDRESS_BUILDINGNUMBER),我的常量命名就会非常长

我是用python来做这件事的,但是任何通用的答案都可以。
谢谢。

您可以编写一个脚本,而不是在更改常量时,更改所有json文件中的结构

例如:

import json
CHANGE = ('steet', 'streetAddress')
json_data = None
with open('file.json') as jfile:
    json_data = jfile.load(jfile)
    json_data[CHANGE[1]], json_data[CHANGE[0]] = json_data[CHANGE[0]], None

正如Cameron Sparr在评论中建议的那样,不要让常量名称包含JSON结构的所有级别。如果在多个地方有相同的数据,那么重用相同的常量实际上会更好。例如,假设您的JSON地址中包含一个电话号码:

{
    "address": {
        "streetAddress": {
            "aptnumber" : "21",
            "building_number" : "2nd", 
            "street" : "Wall Street"
        },
        "city":"New York",
        "phoneNumber":
        [
            {
                "type":"home",
                "number":"212 555-1234"
            }
        ]
    },
    "phoneNumber":
    [
        {
            "type":"home",
            "number":"212 555-1234"
        }
    ]
}
为什么不在两个地方都使用一个常量
PHONES='phoneNumber'
?您的常量将具有更短的名称,并且在逻辑上更加连贯。您最终会这样使用它(假设JSON存储在
person
中):

而不是

person[ADDRESS][ADDRESS_PHONES][x]
person[PHONE_NUMBERS][x]

为什么常量名称必须包含JSON结构的所有级别?只要调用地址->街道地址->aptnumber对应的一个APT_号码,除非在其他地方可以出现aptnumber?为什么不更改字段的名称?如果将
街道地址更改为
地址
,那么您不想将
地址\街道\地址
更改为
地址\地址
?然后你必须在使用常数的任何地方改变它。。。看起来不太节省时间。好吧,我不需要上面所有的图层来命名常量,现在我还有一堆常量:地址,街道地址,城市,公寓号码,街道。。。这仍然很难维持吗?有没有办法组织这件事?就像使用一个模式,我可以直接查询JSON结构中的字段名称?这是C或C++的头文件的目的。只需要一个文件,并在python结构中使用import。这样,您就不需要在其他任何地方进行更改。这会更改JSON文件中的数据。他正在询问更改代码中的键。
person[ADDRESS][ADDRESS_PHONES][x]
person[PHONE_NUMBERS][x]