簡體   English   中英

將 JSON 文件轉換為 Python 對象

[英]Converting a JSON file into Python Objects

我有一個 JSON 文件,我想將其放入 python 對象中。 它有兩個部分,員工和資產,我想將它們加載到兩個獨立的部分中。 這是 JSON 文件的示例:

{
"staff": [
    {
        "id": "DA7153",
        "name": [
            "Fran\u00c3\u00a7ois",
            "Ullman"
        ],
        "department": {
            "name": "Admin"
        },
        "server_admin": "true"
    },
    {
        "id": "DA7356",
        "name": [
            "Bob",
            "Johnson"
        ],
        "department": {
            "name": "Admin"
        },
        "server_admin": "false"
    },
],
"assets": [
    {
        "asset_name": "ENGAGED SLOTH",
        "asset_type": "File",
        "owner": "DA8333",
        "details": {
            "security": {
                "cia": [
                    "HIGH",
                    "INTERMEDIATE",
                    "LOW"
                ],
                "data_categories": {
                    "Personal": "true",
                    "Personal Sensitive": "true",
                    "Customer Sensitive": "true"
                }
            },
            "retention": 2
        },
        "file_type": "Document",
        "server": {
            "server_name": "ISOLATED UGUISU",
            "ip": [
                10,
                234,
                148,
                52
            ]
        }
    },
    {
        "asset_name": "ISOLATED VIPER",
        "asset_type": "File",
        "owner": "DA8262",
        "details": {
            "security": {
                "cia": [
                    "LOW",
                    "HIGH",
                    "LOW"
                ],
                "data_categories": {
                    "Personal": "false",
                    "Personal Sensitive": "false",
                    "Customer Sensitive": "true"
                }
            },
            "retention": 2
        },
    },
]

我試圖為員工創建一個類,但每當我這樣做時,我都會收到錯誤“TypeError:dict 最多需要 1 個參數,得到 3”

我正在使用的代碼如下所示:

import json

with open('Admin_sample.json') as f:
    admin_json = json.load(f)

class staffmem(admin_json):
    def __init__(self, id, name, department, server_admin):
        self.id = id
        self.name = name
        self.deparment = department[name]
        self.server_admin = server_admin

    def staffid(self):
        return self.id

print(staffmem.staffid)

我就是搞不定。 任何幫助,將不勝感激。

謝謝。

以下應該是一個很好的起點,但您必須解決一些問題。 請注意,如果密鑰不存在,我會在任何地方使用get()來提供“安全”默認值:

import json

class StaffMember:
    def __init__(self, json_entry):
        self.name = ",".join(json_entry.get("name"))
        self.id = json_entry.get("id")
        self.dept = json_entry.get("department", {}).get("name")
        self.server_admin = (
            True
            if json_entry.get("server_admin", "false").lower() == "true"
            else False
        )

# Get the data
with open("/tmp/test.data") as f:
    data = json.load(f)

# For every entry in the data["staff"] create object and index them by ID
all_staff = {}
for json_entry in data.get("staff", []):
    tmp = StaffMember(json_entry)
    all_staff[tmp.id] = tmp


print(all_staff)
print(all_staff['DA7153'].name)

輸出:

$ python3 /tmp/test.py
{'DA7153': <__main__.StaffMember object at 0x1097b2d50>, 'DA7356': <__main__.StaffMember object at 0x1097b2d90>}
François,Ullman

潛在的改進:

  • Unicode 處理
  • 添加 getter/setter
  • 考慮添加一個from_json()靜態方法來創建您的對象,而不是在 ctor 中傳遞 json dict
  • 缺失值的錯誤處理
  • 如果此對象僅/主要用於存儲數據,請考慮在 py3 中使用數據類
  • 如果您不打算修改對象(只讀),請考慮注釋中的 namedtuple 方法

筆記:

  • 您提供的 json 不正確 - 您需要修復它
  • 您的示例中的語法是錯誤的,並且命名約定不是很pythonic(在此處閱讀更多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM