JsonSerizable
报错问题详解
背景与简介
在使用 JSON 序列化和反序列化的过程中,我们常常会遇到一些错误,这些错误通常涉及数据类型不匹配、编码不一致或特殊字符处理不当等问题,本文将详细介绍如何应对这些问题,并提供相应的解决方案。
常见报错及解决方法
1. TypeError: Object of type 'xxx' is not JSON serializable
描述
这个错误通常是由于试图序列化一个无法被 JSON 模块直接处理的对象类型引起的,datetIME 对象、自定义类实例等。
解决方法
可以通过自定义编码器来解决此问题,以下是一个示例:
import json from datetime import datetime class MyEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.strftime('%Y%m%d %H:%M:%S') return super(MyEncoder, self).default(obj) data = { 'event': 'meeting', 'time': datetime.now() } json_str = json.dumps(data, cls=MyEncoder) print(json_str)
2. NullReferenceException in .NET Core with System.Text.Json
描述
在使用 .NET Core 的 System.Text.Json 进行序列化时,如果遇到无参构造函数不可用的情况,会抛出 NullReferenceException。
解决方法
确保类有一个无参构造函数,或者使用 Newtonsoft.Json 作为替代:
public class C { public string PracticeName { get; set; } public C() { } // 确保有无参构造函数 } var x = new C { PracticeName = "1" }; var json = JsonConvert.SerializeObject(x);
3. Flutter中使用 json_serializable 的问题
描述
在 Flutter 中,使用 json_serializable 包生成模型类时,可能会遇到代码生成不正确或不完整的问题。
解决方法
确保 pubspec.yaml 文件中包含必要的依赖,并正确执行构建命令:
dependencies: flutter: sdk: flutter json_annotation: ^4.5.0 dev_dependencies: build_runner: ^2.1.11 json_serializable: ^6.2.0
然后运行以下命令生成代码:
flutter pub run build_runner build
进阶问题及解决
特殊字符导致解析失败
描述
JSON 数据中包含转义字符(如 \" 或 \\)会导致解析失败。
解决方法
可以使用正则表达式或字符串替换方法去除或转义这些特殊字符:
import re json_str = '{"data": "value with special chars \\" and \\\\"}"}' cleaned_json_str = re.sub(r'\\', r'\\\\', json_str) cleaned_json_str = re.sub(r'"', r'\\"', cleaned_json_str) parsed_json = json.loads(cleaned_json_str) print(parsed_json)
浮点数精度丢失
描述
在 JSON 序列化过程中,浮点数可能会失去精度。
解决方法
将浮点数转换为字符串格式再进行序列化:
import json data = { 'pi': 3.141592653589793 } json_str = json.dumps(data, ensure_ascii=False) print(json_str)
JSON 序列化和反序列化是开发过程中非常常见的操作,但其中的细节和潜在问题也不少,通过了解常见问题及其解决方法,可以有效避免这些问题的发生,提高开发效率和代码稳定性,希望本文能帮助大家更好地处理 JSON 相关的问题。
FAQs
Q1:如何处理 JSON 中的日期时间格式?
A1:可以使用自定义编码器将日期时间对象转换为字符串格式,如下所示:
class MyEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.strftime('%Y%m%d %H:%M:%S') return super(MyEncoder, self).default(obj)
Q2:如何在 Flutter 项目中使用 json_serializable 自动生成模型类?
A2:确保在 pubspec.yaml 文件中添加以下依赖,并运行构建命令:
dependencies: flutter: sdk: flutter json_annotation: ^4.5.0 dev_dependencies: build_runner: ^2.1.11 json_serializable: ^6.2.0
然后运行:
flutter pub run build_runner build