1️⃣ 問題背景
在自動化、MES/SFCS、WebService 整合時,Python 常需將一組 dict 陣列(list of dict)包成字串,再塞進 JSON 的某個欄位。
這是因為**對方系統(如 LabVIEW、C# WebService)**僅接受「字串型態」的 JSON array,而不是直接的物件或陣列。
你遇到的現象
- Python 端假設原始資料:
fruit_quality_list = [
{"Item": "Apple", "Weight": "150", "Color": "Red", "Sweetness": "High"},
{"Item": "Banana", "Weight": "120", "Color": "Yellow", "Sweetness": "Medium"}
] - 對方系統需求:
不是直接傳陣列,而是要這樣:{
"ItemName": "FruitQualityList",
"ItemValue": "[{\"Item\":\"Apple\",\"Weight\":\"150\",\"Color\":\"Red\",\"Sweetness\":\"High\"},{\"Item\":\"Banana\",\"Weight\":\"120\",\"Color\":\"Yellow\",\"Sweetness\":\"Medium\"}]"
} - 常見錯誤:
- 手動組字串,格式錯誤
- 少了 escape,或多了不該有的引號
- 對方解析報錯:Error converting value "Item" to type ...
2️⃣ Python 正確轉換步驟
步驟一:組好你的 list of dict
fruit_quality_list = [
{"Item": "Apple", "Weight": "150", "Color": "Red", "Sweetness": "High"},
{"Item": "Banana", "Weight": "120", "Color": "Yellow", "Sweetness": "Medium"}
]
步驟二:用 json.dumps()
轉成字串
import json
fruit_quality_list_str = json.dumps(fruit_quality_list, ensure_ascii=False)
- 這樣
fruit_quality_list_str
就是:[{"Item": "Apple", "Weight": "150", "Color": "Red", "Sweetness": "High"}, {"Item": "Banana", "Weight": "120", "Color": "Yellow", "Sweetness": "Medium"}]
- 注意: 這是「字串型態」的 JSON 陣列,裡面每個元素都是物件。
步驟三:塞進你的 Items
items = [
{"ItemName": "FruitQualityList", "ItemValue": fruit_quality_list_str}
]
步驟四:包進最終 JSON
final_data = {
"MachineID": "LINE01",
"Items": items
}
- 用
json.dumps(final_data, ensure_ascii=False)
送出即可。
3️⃣ 常見錯誤與排查
錯誤 1:手動組字串,格式錯誤
# 錯誤寫法
fruit_quality_list_str = '[\"Item\":\"Apple\",\"Weight\":\"150\"]'
# 這不是合法的 JSON 陣列!
錯誤 2:少了大括號
# 錯誤寫法
fruit_quality_list_str = '["Item":"Apple","Weight":"150"]'
# 這不是物件,是 key:value 錯誤組合
錯誤 3:多了不該有的 escape 或引號
- 只要用
json.dumps()
,Python 會自動處理所有 escape,不要手動加斜線或引號。
錯誤 4:對方系統報錯
Error converting value "Item" to type ...
代表你傳過去的不是物件陣列,而是 key:value 字串。
排查建議
- 本地先 print 出來,貼到 JSONLint 驗證格式。
- 用 Python 反序列化測試:
python複製程式碼json.loads(fruit_quality_list_str)
如果能正常 parse,格式就對了。
4️⃣ 跨語言注意事項
LabVIEW
- LabVIEW 解析 JSON 時,常只能接受「字串型態」的 JSON array。
- 請確保你傳過去的是「字串」,不是 Python 的 list 物件。
C# WebService
- C# 端通常會用
JArray.Parse()
或JsonConvert.DeserializeObject<List<T>>()
解析。 - 如果你傳的是錯誤格式(如 key:value 字串),C# 會報型別錯誤。
WebService/REST API
- 有些 API 會要求你把複雜資料塞在某個欄位(如
ItemValue
),這時就要用「字串包 JSON 陣列」。 - 請務必用
json.dumps()
,不要手動組字串。
5️⃣ 實戰技巧
- 永遠用
json.dumps()
處理,不要手動組字串。 - 本地測試:先用
json.loads()
反序列化,確保格式正確。 - 跨語言溝通:跟對方確認「要字串還是物件」,避免誤會。
- 遇到錯誤訊息:仔細看是哪個欄位、哪個型別,通常都是格式問題。
6️⃣ 完整範例
import json
# Step 1: 組資料
fruit_quality_list = [
{"Item": "Apple", "Weight": "150", "Color": "Red", "Sweetness": "High"},
{"Item": "Banana", "Weight": "120", "Color": "Yellow", "Sweetness": "Medium"}
]
# Step 2: 轉成 JSON 字串
fruit_quality_list_str = json.dumps(fruit_quality_list, ensure_ascii=False)
# Step 3: 塞進 Items
items = [
{"ItemName": "FruitQualityList", "ItemValue": fruit_quality_list_str}
]
# Step 4: 組最終資料
final_data = {
"MachineID": "LINE01",
"Items": items
}
# Step 5: 送出前可 print 檢查
print(json.dumps(final_data, ensure_ascii=False, indent=2))
輸出結果
{
"MachineID": "LINE01",
"Items": [
{
"ItemName": "FruitQualityList",
"ItemValue": "[{\"Item\": \"Apple\", \"Weight\": \"150\", \"Color\": \"Red\", \"Sweetness\": \"High\"}, {\"Item\": \"Banana\", \"Weight\": \"120\", \"Color\": \"Yellow\", \"Sweetness\": \"Medium\"}]"
}
]
}
7️⃣ 結論
- 跨語言資料交換時,格式最重要!
- 用 Python 的
json.dumps()
處理一切 JSON 字串化需求。 - 遇到解析錯誤,先驗證你產生的 JSON 字串格式!