python将json数据加载到数据映射类对象

Posted

技术标签:

【中文标题】python将json数据加载到数据映射类对象【英文标题】:python load json data to a datamap class object 【发布时间】:2020-06-26 15:00:17 【问题描述】:

我对 Python 类有点陌生。我使用 python,但没有广泛使用类。所以这就是我想要做的,是读取 JSON 并将元素和节点转换为类和对象,所以我调用函数从 JSON 中获取值。


  "datamap": 
    "version": "1.0",
    "sourceProvider": "example_provider",
    "logicalTables": [
      
        "name": "region_table_one",
        "physicalTable": "dbo_parent_user", 
        "logicalColumns": [
          
            "name": "UID",
            "physicalColumnName": "uid_number",
            "displayName": "U Number",
            "logicalDataType": "integer",
            "inputType": 
              "inputAction": "number",
              "multiSelect": false
            ,
          ,
          
            "name": "UID1",
            "physicalColumnName": "uid_number1",
            "displayName": "U Number1",
            "logicalDataType": "integer",
            "inputType": 
              "inputAction": "number",
              "multiSelect": false
            ,
          ,
        ]
      ,
      
        "name": "region_table_two",
        "physicalTable": "dbo_user_two", 
        "logicalColumns": [
          
            "name": "UID2",
            "physicalColumnName": "uid_number2",
            "displayName": "U Number2",
            "logicalDataType": "integer",
            "inputType": 
              "inputAction": "number",
              "multiSelect": false
            ,
          ,
          
            "name": "UID3",
            "physicalColumnName": "uid_number3",
            "displayName": "U Number3",
            "logicalDataType": "integer",
            "inputType": 
              "inputAction": "number",
              "multiSelect": false
            ,
          ,
        ]
      
    ]
  

我写的 Python 类:

import json

class DataMap(object):
    def __init__(self):
        with open('datamap.json') as f:
            self.__dict__ = json.load(f)

    def get_logical_table(self, tableName):
        if self.datamap['logicalTables']['name'] == tableName:
            return datamap['logicalTables']['name']

obj = DataMap()
print(obj.datamap['logicalTables'])
#print(obj.get_logical_table('logicalTables'))

我想做的是,如果我打电话给get_logical_table,我应该能够得到region_table_oneregion_table_two。 如果我通过get_logical_table 输出来获取该JSON 对象内的logicalColumns,是否有任何方法。

我指的是: - https://thepythonguru.com/reading-and-writing-json-in-python/ - Deserialize a json string to an object in python 在某种程度上,但坚持阅读课堂笔记。提前感谢您的帮助。

更新:

import json


class DataMap(object):
    def __init__(self):
        self.logical_tables = None
        with open('datamap.json') as f:
            self.__dict__ = json.load(f)
        self.data_map = self.__dict__['datamap']

    def get_map_id(self):
        return self.data_map['mapId']

    def get_version(self):
        return self.data_map['version']

    def get_region(self):
        return self.data_map['region']

    def get_source_provider(self):
        return self.data_map['sourceProvider']

    def __getitem__(self, key):
        return self.data_map[key]

    def __repr__(self):
        return repr(self.data_map)

    def __len__(self):
        return len(self.__dict__['datamap'])

    def copy(self):
        return self.data_map.copy()

    def has_key(self, k):
        return k in self.data_map

    def keys(self):
        return self.data_map.keys()

    def values(self):
        return self.data_map.values()

    def items(self):
        return self.data_map.items()

    def pop(self, *args):
        return self.data_map.pop(*args)

    def __contains__(self, item):
        return item in self.data_map

    def __iter__(self):
        return iter(self.data_map)


class LogicalTables(DataMap):
    def __init__(self):
        DataMap.__init__(self)
        self.logical_tables = self.data_map['logicalTables']

        logical_table = None
        for table in self.get_all_logical_tables():
            self.name = table.get("name")
        print(self.name)

    def __len__(self):
        return len(self.data_map['logicalTables'])

    def __repr__(self):
        return repr(self.logical_tables)

    def createName(self):
        self.name = "Temporary Value"

    def has_key(self, k, table_name=None):
        """Check if the dict has given key"""
        logical_table = self.get_logical_table(table_name)
        return k in logical_table

    def get_all_logical_tables(self, tableName=None):
        return self.data_map['logicalTables']

    def get_logical_table(self, table_name=None):
        logical_table = None
        for table in self.get_all_logical_tables():
            if table.get("name") == table_name:
                logical_table = table
        return logical_table

    def get_logical_table_list(self, table_name=None):
        table_list = []
        for table in self.get_all_logical_tables():
            table_list.append(table.get("name"))
        return table_list


class LogicalColumns(LogicalTables):
    def __init__(self):
        LogicalTables.__init__(self)
        self.logical_columns = self.logical_tables['logicalColumns']

    def __len__(self):
        return len(self.logical_columns['logicalColumns'])

    def __repr__(self):
        return repr(self.logical_columns)

我已经更新了,这是我目前的课程。

【问题讨论】:

【参考方案1】:

你的 json 输入中的logicalTables 实际上是list,而不是dict,所以你做['logicalTables']['name'] 是行不通的。

您需要将get_logical_table 更改为如下内容:

    def get_logical_table(self, tableName):
        for table in self.datamap['logicalTables']:
            if table['name'] == tableName:
                return table['logicalColumns']

与其遍历列表,不如转换您的dict,这样您就可以直接访问任何带有namelogicalTable(如果它们是唯一的)。

更新:

您可以像这样转换dict

tables = 
for table in self.datamap['logicalTables']:
    name = table['name']
    del table['name']
    tables[name] = table

self.datamap['logicalTables'] = tables

# Use like so:
table_one = self.datamap['logicalTables']['region_table_one']

【讨论】:

我如何transform to dict 在线提供任何示例? @戈登 我已经做了一些修改。 我希望self.datamap['logicalTables'] 成为dict,键是每个logicalTables 项目的name,值是表格(可能没有name 项目,因为它是不必要的)。同样,名称必须是唯一的才能正常工作。 是的,我们可以修改datamap,因为我自己定义了它。它们的键永远是唯一的。 我已经更新了我的答案,向您展示如何转换字典。很明显,如果有的话,你如何改变它完全取决于你。

以上是关于python将json数据加载到数据映射类对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 AlamofireObjectMapper 将对象 json 数据映射到 2 个单独的数组中

Firebase Documentsnapshot 映射到 Flutter 中的 Json 对象

使用Spring RestTemplate将嵌套的JSON对象映射到Java类

将大型 Twitter JSON 数据 (7GB+) 加载到 Python 中

Python每日一练——数据存储第三关:如何将一个JSON文档映射为Python对象

Python面试必考重点之数据存储第三关——如何将一个JSON文档映射为Python对象