首页 > 解决方案 > Java GSON 和 Flutter json_annotation 的区别导致错误

问题描述

我正在尝试使用 Flutter/Dart 与 Java Netty 服务器进行通信。我在 Java 端使用 Gson,在 Flutter 端使用 json_annotation 和/或手动序列化 JSON 方法。他们都使用UTF8。问题是我使用这种语法:

{
  "ENCRYPT": false, // to use to check if the packet is encrypted
  "jsonObject": {} // The packet class. This gets encrypted if it ENCRYPT = true
  "packetIdentifier": "" // Name of packet so it can be deserialized correctly
}

问题是,GSON 和 Flutter 序列化的结果不同,导致双方都出错。

GSON InitialPacket 示例编解码器在这里 数据包

{
  "ENCRYPT": false,
  "jsonObject": "{\"versionData\":{\"version\":\"1.5.3\",\"minVersion\":\"1.5.3\"}}",
  "packetIdentifier": "INITIAL_HANDSHAKE_PACKET"
}

Flutter InitialPacket 示例编解码器在这里 数据包

{
 "ENCRYPT": false,
 "jsonObject": {
   "versionData": {
     "version": "1.5.3",
     "minVersion": "1.5.3"
    }
  },
 "packetIdentifier": "INITIAL_HANDSHAKE_PACKET"
}

我可以使用的最佳解决方案是什么,所以两个结果都是一样的?为了测试,我一直在运行 Java 服务器和 Flutter 应用程序,并从 Flutter 应用程序连接到 Java 服务器。在撰写本文时,双方都有调试日志,以查看写入、接收的内容以及发生错误时显示的 JSON 字符串。服务器 jar 是gradle clean buildjava目录中构建的,并且该 jar 位于java/server/build/libs/并且只是server-1.0-SNAPSHOT.jar

注意:我从上面的示例中删除了 publicKey 字段,因为它是随机生成的,长度为 4096 位,使其更难阅读。

标签: jsonflutterserializationdart

解决方案


@Richard Heap您显然已经对 jsonObject 进行了两次编码。首先必须将 versionData 映射编码为字符串,然后将其包含在数据包映射中,然后再进行 json 编码。只需在 Dart 中做同样的事情。在 Dart 中解码时,解码数据包映射以获取 jsonObject,然后对其进行解码。

是的,这就是解决方案。谢谢 :)


推荐阅读