首页 > 解决方案 > 在 Python 中将字典转换为 JSON

问题描述

我需要帮助将以下字典转换为 json:

summary = {'model': 'Test', 'devices': '0,1', 'config': {'data': {'name': 'ABC', 'labels': 'outputs/export2_v2', 'cache_in_memory': False, 'validation_size': 192, 'augmentation': {'photometric': {'enable': True, 'primitives': ['random_brightness', 'random_contrast', 'additive_speckle_noise', 'additive_gaussian_noise', 'additive_shade', 'motion_blur'], 'params': {'random_brightness': {'max_abs_change': 50}, 'random_contrast': {'strength_range': [0.3, 1.5]}, 'additive_gaussian_noise': {'stddev_range': [0, 10]}, 'additive_speckle_noise': {'prob_range': [0, 0.0035]}, 'additive_shade': {'transparency_range': [-0.5, 0.5], 'kernel_size_range': [100, 150]}, 'motion_blur': {'max_kernel_size': 3}}}, 'homographic': {'enable': True, 'params': {'translation': True, 'rotation': True, 'scaling': True, 'perspective': True, 'scaling_amplitude': 0.2, 'perspective_amplitude_x': 0.2, 'perspective_amplitude_y': 0.2, 'patch_ratio': 0.85, 'max_angle': 1.57, 'allow_artifacts': True}, 'valid_border_margin': 3}}}, 'model': {'batch_size': 32, 'detection_threshold': 0.001, 'eval_batch_size': 32, 'learning_rate': 0.001, 'name': 'magic_point', 'nms': 4}, 'train_iter': 6, 'eval_iter': 2, 'validation_interval': 2, 'save_interval': 5000, 'keep_checkpoints': 20}, 'model_path': 'experiments/Test', 'Train_summary': [{'iteration': 0, 'loss': 4.6594462, 'precision': 0.0022884681450641656, 'recall': 0.059423500770503866}, {'iteration': 2, 'loss': 4.1882625, 'precision': 0.002276572784097017, 'recall': 0.060493180490456044}, {'iteration': 4, 'loss': 3.7569315, 'precision': 0.002235827870127771, 'recall': 0.057959385252174776}], 'Test_summary': {'precision': 0.0022856936059727296, 'recall': 0.05952331782349892}}

我试过 json.dumps 但我收到以下错误:

TypeError: Object of type 'float32' is not JSON serializable

标签: pythonjsonpython-3.xdictionary

解决方案


通常,当您尝试将 numpy float32 对象序列化为 JSON 时,会发生这种情况。一个可重复的将是这样的:

import json
import numpy as np
ar = np.array([1.12321, 2.123123], dtype=np.float32)
d = {'randomKey': ar[0]}
json.dumps(d)

TypeError: Object of type 'float32' is not JSON serializable

解决方法是您需要扩展 JSONEncoder 类以序列化 numpy float32 值

class NumpyFloatValuesEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.float32):
            return float(obj)
        return JSONEncoder.default(self, obj)
json.dumps(d, cls=NumpyFloatValuesEncoder)

您可以根据需要对此进行自定义。您可以在此处阅读有关此内容的更多信息https://docs.python.org/3/library/json.html


推荐阅读