我正在用Flutter开发我的第一个移动应用程序,我对此表示怀疑.

假设应用程序收到如下JSON:

{
  "_id": "123",
  "name": "X",
}

要接收并发送,将创建以下模型:

class User {
   String id;
   String name;

   User({
      this.id,
      this.name
   });

   factory User.fromJson(Map<String, dynamic> json) => User(
      id: json["_id"],
      name: json["name"]
   );

   Map<String, dynamic> toJson() => {
      "_id": id,
      "name": name
   };
}

现在,出于某种原因,我需要将该数据的模型 struct 更改为,例如:

{
   "id": "123",
   "info": {
      "name":"X",
      "age":"20"
   }
}

数据库中有使用旧 struct 存储的对象,当应用程序接收到这些对象时,会出现错误,因为新模型与旧数据不匹配.

如果应用程序已经在生产中,在不影响用户的情况下,避免此错误的最常见方法是什么?

推荐答案

有无数版本控制的 idea 和框架,但最基本的是:

  • 将数据更新到新模型
  • 创建第二个端点,将新的数据模型交付给您的应用程序
  • 保留旧的端点,从新的数据 struct 中读取数据,这样旧的应用程序仍然可以工作!
  • 创建一个应用程序更新,您可以在其中与新端点对话,并提供新的数据 struct
  • 当您确定有足够的用户进行了更新时,请删除旧的端点(可能是"从不")

或:

  • 更改后端
  • 更改前端
  • 同时部署它们并强制用户更新

第一个更易于用户友好,因为您可以异步工作和部署.例如,您可以先部署新的后端,同时等待app store对新应用的批准.

Json相关问答推荐

时间序列的Vega Lite分组条形图

Powershell ConvertFrom-Json 意外地从包含字符串的单个项目数组生成字符串而不是对象数组

使用 Powershell,如何将 Azure AD 组成员转换为 Json 对象(文件),然后可以更新?

将不带正文的 CURL POST 转换为 RESTRequest Delphi 代码 / 为 Dropbox API /get_current_account 端点编写 Delphi 代码

如何在 JSonPath 中按值查找列表中的所有元素

流导入错误:重新上传时不存在布局释放 UUID

N1QL 搜索对象内的某些对象

如何一次加载无限滚动中的所有条目以解析python中的HTML

如何在返回对象的 Spring MVC @RestController @ResponseBody 类中响应 HTTP 状态代码?

如何为名称/值 struct 创建 JSON 模式?

Java JSON 序列化 - 最佳实践

直接从 Java 中的模型类创建 JSON 对象

使用 GSON 解析嵌套的 JSON 数据

如何在已声明的 JSON 对象中添加键值对

关于使用 $ref 的 JSON 模式

在android中读取Json数组

Jackson JSON序列化,通过级别定义避免递归

获取一个数字的 PHP 对象属性

如何对 Javascript 对象进行排序,或将其转换为数组?

用 JSON 编写 HTML 字符串