You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决ChainMap对象无法序列化为JSON文件的问题?

Fixing "TypeError: Object of type 'ChainMap' is not JSON serializable"

Got it, let's tackle this JSON serialization issue with ChainMap step by step. The core problem here is that the standard json module doesn't recognize ChainMap objects as natively serializable—so we need to either convert them to a JSON-friendly type first, or teach the JSON encoder how to handle them.

Option 1: Convert ChainMap to a Regular Dictionary Before Serialization

Since ChainMap is just a view over multiple dictionaries, we can easily convert it to a single merged dictionary using dict(). This works because dict(chain_map_instance) will combine all the underlying dictionaries into one (with later dictionaries overriding earlier keys, just like ChainMap does).

Here's how to apply this to your example data:

from collections import ChainMap
import json

# Your original data
t = [ChainMap(
    {'a': 'ITT002', 'b': {'c': '2', 'd': '2', 'e': '2'}, 'f': '2'},
    {'g': {'h1': {'i': '22', 'j': '2', 'k': '2', 'l': '2', 'n': '2'}}}
)]

# Convert each ChainMap in the list to a regular dictionary
converted_data = [dict(cm) for cm in t]

# Save to JSON file
with open('output.json', 'w') as f:
    json.dump(converted_data, f, indent=4)

This will produce a valid JSON file with all your data merged into standard dictionaries.

Option 2: Custom JSON Encoder for ChainMap

If you don't want to pre-convert your ChainMap objects, you can create a custom JSONEncoder that tells the json module how to serialize ChainMap instances.

from collections import ChainMap
import json

class ChainMapEncoder(json.JSONEncoder):
    def default(self, obj):
        # If the object is a ChainMap, convert it to a dict
        if isinstance(obj, ChainMap):
            return dict(obj)
        # Let the parent class handle all other types
        return super().default(obj)

# Your original data
t = [ChainMap(
    {'a': 'ITT002', 'b': {'c': '2', 'd': '2', 'e': '2'}, 'f': '2'},
    {'g': {'h1': {'i': '22', 'j': '2', 'k': '2', 'l': '2', 'n': '2'}}}
)]

# Use the custom encoder when dumping
with open('output.json', 'w') as f:
    json.dump(t, f, cls=ChainMapEncoder, indent=4)

Removing ChainMap Entirely (Avoiding the Issue Upfront)

If you don't need the dynamic view behavior of ChainMap, you can just merge your dictionaries directly into a regular dictionary from the start. This way, you won't run into serialization issues at all.

For Python 3.9+ (using the | operator):

import json

# Define your individual dictionaries
dict1 = {'a': 'ITT002', 'b': {'c': '2', 'd': '2', 'e': '2'}, 'f': '2'}
dict2 = {'g': {'h1': {'i': '22', 'j': '2', 'k': '2', 'l': '2', 'n': '2'}}}

# Merge the dictionaries
merged_dict = dict1 | dict2

# Create your list (same structure as original, but without ChainMap)
t = [merged_dict]

# Save to JSON
with open('output.json', 'w') as f:
    json.dump(t, f, indent=4)

For older Python versions (using dictionary unpacking):

import json

dict1 = {'a': 'ITT002', 'b': {'c': '2', 'd': '2', 'e': '2'}, 'f': '2'}
dict2 = {'g': {'h1': {'i': '22', 'j': '2', 'k': '2', 'l': '2', 'n': '2'}}}

merged_dict = {**dict1, **dict2}
t = [merged_dict]

with open('output.json', 'w') as f:
    json.dump(t, f, indent=4)

All these approaches will resolve the serialization error and let you save your data to a valid JSON file.

内容的提问来源于stack exchange,提问作者june davis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:46:21