【问题标题】:How to generate unique name for each JSON value如何为每个 JSON 值生成唯一名称
【发布时间】:2016-09-30 11:20:44
【问题描述】:

我有以下从 REST 服务返回的 JSON,我想通过组合父键为每个值生成唯一名称。例如。 name+phone+address+city+namename+phone+address+city+population+skilled+male 等等。

{
  "name": "name",
  "phone": "343444444",
  "address": {
    "lat": 23.444,
    "lng": 34.3322,
    "city":{
      "name": "city name",
      "population": {
        "skilled": {
          "male": 2,
          "female": 4
        },
        "uneducated": {
          "male": 20,
          "femail": 4
        }
      }
    }
  },
  "email": "email",
  "education": "phd"
}

我想组合从 JSON 树的父级开始的所有键名。

这就是我正在做的事情

class TestJson
     def walk_through(self, json_object):
        for k, v in json_object.items():
            self.x_path = self.x_path + k
            if type(v) is dict:
                self.walk_through(v)
            else:
                print(self.x_path)
                self.x_path = ""

此代码正在打印键,但仅从当前父节点开始。我想将所有键组合到 json 的根目录。

【问题讨论】:

  • 不保证键的顺序总是相同的。
  • @gre_gor 有没有办法保持订单不变?

标签: python json python-3.x


【解决方案1】:

如果您忽略 namephone 键,因为它们不是 city nameskilled male 的祖先并且键的顺序不能保证,您可以递归地构建一个扁平化的字典。

def walk_through(json_object):
    d = {}
    for k, v in json_object.items():
        if isinstance(v, dict):
            v = walk_through(v)
            for vk, vv in v.items():
                d["%s+%s" % (k, vk)] = vv
        else:
            d[k] = v
    return d

print(json.dumps(walk_through(json_object), indent=2))

打印出来:

{
  "address+city+population+skilled+male": 2, 
  "name": "name", 
  "address+lng": 34.3322, 
  "address+city+name": "city name", 
  "address+lat": 23.444, 
  "address+city+population+uneducated+male": 20, 
  "phone": "343444444", 
  "address+city+population+uneducated+femail": 4, 
  "education": "phd", 
  "email": "email", 
  "address+city+population+skilled+female": 4
}

注意:这会忽略列表,不会在其中找到字典。

【讨论】:

    【解决方案2】:

    如果要打印 python dict 的所有键,可以执行以下操作:

    def print_keys(d):
        for key, value in d.iteritems():
            print key,
            if isinstance(value, dict):
                print_keys(value)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      相关资源
      最近更新 更多