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

Flutter Clean架构中fromJson/toJson应放在业务层还是数据层?

Clean架构中fromJson/toJson的处理位置

核心原则

Clean架构的核心就是让业务层(领域层)彻底脱离外部依赖,业务层的Entity只负责承载业务逻辑和核心数据,绝对不能掺和数据序列化这种和具体数据源绑定的细节——这类细节属于数据层的职责范畴。

具体实现方式

  • 业务层Entity:只保留业务相关的属性和方法,完全不碰fromJson/toJson。比如:
    // 业务层UserEntity
    data class UserEntity(
        val userId: String,
        val nickname: String,
        val contactEmail: String
        // 这里只放业务逻辑方法,比如checkEmailValid()
    )
    
  • 数据层Model:作为和外部数据源(API、数据库)交互的专属载体,负责实现fromJson(把接口返回的JSON转成Model)、toJson(把Model转成JSON用于接口请求),同时提供和业务层Entity互相转换的方法。比如:
    // 数据层UserModel(继承自Entity的话,可根据实际情况调整结构)
    data class UserModel(
        val id: String,
        val nickname: String,
        val email: String,
        val apiOnlyField: String // 接口返回但业务层不需要的字段
    ) {
        // 从JSON反序列化为Model
        fun fromJson(jsonStr: String): UserModel {
            // 这里写具体的序列化逻辑,比如用Moshi/Gson解析
        }
    
        // 把Model序列化为JSON字符串
        fun toJson(): String {
            // 具体序列化逻辑实现
        }
    
        // 转换为业务层需要的Entity
        fun mapToEntity(): UserEntity {
            return UserEntity(
                userId = this.id,
                nickname = this.nickname,
                contactEmail = this.email
            )
        }
    }
    
  • 数据层Repository:在和数据源交互时,先把JSON转成数据层Model,再转换成业务层Entity返回给上层;当需要提交数据时,接收业务层传来的Entity,转成Model后序列化为JSON发送给数据源。

这么做的原因

  • 业务层彻底解耦:如果后续接口JSON结构变动,只需要修改数据层的Model和转换逻辑,业务层的代码完全不用动,避免牵一发而动全身。
  • 符合Clean架构依赖规则:依赖只能从外层(数据层)指向内层(业务层),数据层可以依赖业务层的Entity,但业务层绝对不能依赖数据层的序列化工具或逻辑,否则就破坏了架构的独立性。

内容的提问来源于stack exchange,提问作者Carpe Noctem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:13:21