将任何JSON转换为名称/值对

时间:2016-01-18 10:16:07

标签: python json

我有一个源JSON,可以是任何潜在的格式。用于存储和处理目的,我想以2列格式保存这些数据。

例如,我想要以下JSON:

"record" {
  "name1": "value1",
  "name2": "value2",
  "parameters": {
    "param": {},
    "paramSet": {
      "items": [{
        "id": "id1"
      }, {
        "id": "id2"
      }]
    }
  }
}

要转换为以下类似CSV的格式:

record:name1 , "value1"
record:name2 , "value2"
record:parameters:param , ""
record:parameters:paramSet:items#0:id , "id1"
record:parameters:paramSet:items#1:id , "id2"

我的问题是:

  1. 这个转换是否有正式名称(以便我可以更好地搜索)。
  2. 是否有像这样的2列格式表示JSON的标准或约定?
  3. Python中是否有可以为我执行此操作的库?
  4. 是否有其他主要编程语言的库可以更容易地实现它?
  5. 提前致谢。

1 个答案:

答案 0 :(得分:1)

首先,我让json正确:

{
  "record": {
    "name1": "value1",
    "name2": "value2",
    "parameters": {
      "param": {},
      "paramSet": {
        "items": [
          {
            "id": "id1"
          },
          {
            "id": "id2"
          }
        ]
      }
    }
  }
}

接下来是一些递归模拟json的代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json


class Thing(object):
    data = ''
    output = []

    def __init__(self, file_name):
        with open(file_name) as data_file:
            self.data = json.load(data_file)

    def mock(self):
        for (i, item) in enumerate(self.data):
            if type(self.data[item]) == dict:
                self._recursive(self.data[item], item)
        for (i, data) in enumerate(self.output):
            print(data)

    def _recursive(self, request_data, path):
        for (i, item) in enumerate(request_data):
            if type(request_data[item]) == dict:
                if len(request_data[item]) > 0:
                    path2 = "{}:{}".format(path, item)
                    self._recursive(request_data[item], path2)
                else:
                    self.output.append("{}:{}, \"\"".format(path, item))
            elif type(request_data[item]) == list:
                for (j, list_item) in enumerate(request_data[item]):
                    path2 = "{}:{}#{}".format(path, item, j)
                    self._recursive(request_data[item][j], path2)
            else:
                self.output.append("{}:{}, {}".format(path, item, request_data[item]))

thing = Thing("input.json")
thing.mock()

以下代码将输出:

record:name1, value1
record:name2, value2
record:parameters:paramSet:items#0:id, id1
record:parameters:paramSet:items#1:id, id2
record:parameters:param, ""