簡體   English   中英

“目標格式的 plist 中的 object 無效”將 plist 轉換為 json 時出錯

[英]"invalid object in plist for destination format" Error converting plist to json

當我嘗試使用plutil -convert json -將 Plist 轉換為 JSON 時,由於輸入中的 object 無效,它給了我一個錯誤。 例如:

$ ioreg -rw0 -c AppleSmartBattery -a | plutil -convert json -
<stdin>: invalid object in plist for destination format

當輸入包含 JSON 格式的無效 object 時,如何將 Plist 轉換為 JSON?

當 plist 包含與 6 個 JSON 類型(字符串、數字、boolean、數組、object、null)不兼容的數據時,會發生這種情況。 最常見的(可能只有?)示例是二進制數據。

Python has a built-in library for parsing plist data, and it also conveniently allows us to specify custom behavior for serializing to JSON when an object is not compatible with JSON.

This lets us create a relatively simple python one-liner (to use in the shell) or a function we can use in python code, where we specify how to handle binary data that can't be serialized to JSON.

我首選的方法是 base64 對二進制數據進行編碼,並在其前面加上base64: ,這樣如果我將來需要它,數據仍然可用。 這是我的 shell 單線,我可以將 pipe plist output 放入:

python -c 'import plistlib,sys,json,base64; print(json.dumps(plistlib.loads(sys.stdin.read().encode("utf-8")), default=lambda o:"base64:"+base64.b64encode(o).decode("ascii")))'

這是多行編寫的代碼,因此您可以看到它在做什么:

import plistlib
import sys
import json
import base64

stdin_bytes = sys.stdin.read()
stdin_str = stdin_bytes.encode("utf-8")
plist_data = plistlib.loads(stdin_str)

def json_default_fn(o):
    return "base64:" + base64.b64encode(o).decode('ascii')

json_data = json.dumps(plist_data, default=json_default_fn)

print(json_data)

我的建議是將單線包裝在 bash/zsh/sh function 中並將其放入您的.bashrc / .zshrc / .profile /etc 中。 使其易於使用:

plist_to_json() {
  python -c 'import plistlib,sys,json,base64; print(json.dumps(plistlib.loads(sys.stdin.read().encode("utf-8")), default=lambda o:"base64:"+base64.b64encode(o).decode("ascii")))'
}

使用示例(打印 MacBook 電池信息):

$ ioreg -rw0 -c AppleSmartBattery -a | plist_to_json

請注意,如果您關心被編碼的二進制數據,您可以在 json 轉儲中使用不同的默認 function,例如lambda o: "<Not Serializable>"

暫無
暫無

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

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