json - 我的 RCP 客户端未返回对象的深拷贝

标签 json dart rpc

我一直在开发 RCP 客户端来处理天气数据。

我做的是两件事,首先我抓取了我将使用的 JSON 并将其放入 dart 文件中。请参阅:https://dartpad.dartlang.org/a9c1fe8ce34c608eaa28

我的server.dart页面,将导入天气数据,然后执行以下操作:

import "dart:io";
import "weather_data.dart";
import "dart:convert";
import "package:rpc/rpc.dart";

find ApiServer _apiServer = new ApiServer(prettyPrint:true);
main() async {
  Weather w = new Weather(WeatherJson);
  TestServer ts = new TestServer(w);
  _apiServer.addApi(ts);
  HttpServer server = await HttperServer.bind(InternetAddress.ANY_IP_V4, 12345);
  server.listen(_apiServer.httpRequestHandler);
}

class Weather{
  Map weather;
  Weather(this.weather){
    Map get daily => weather["daily"];
  }
}

@ApiClass(name:"test_server", version: 'v1', description: 'This is a test server api to ping for some quick sample data.')
class TestServer {
  Weather myWeather;
  TestServer(this.myWeather){

  }

  @ApiMethod(method:'GET', path: 'daily')
  Map<String, Object> getDaily(){
    return myWeather.daily;
  }
}

所以,服务器正确启动,我将转到localhost:12345/test_server/v1/daily它会返回这个:

{
 "summary": {},
 "icon": {},
 "data": {}
}

这是不正确的。如果你查找 JSON 数据,summary 和 icon 都是字符串,data 是一个数组。它们也是空的,并且应该包含我想要返回的数据。

为什么会出现这种情况?是因为我要返回Map<String, Object> ?我试图将其设置为:Map<String, dynamic>但 dart 编译器不喜欢它。

如何获取此数据以返回正确的数据集?

RPC 的 Dart 网站位于:https://github.com/dart-lang/rpc 您可以看到,在方法下,方法的返回值可以是类的实例,也可以是 future。这和往常一样是有意义的,所以我将其设置为 Map<String,Object>尽管试图含糊其辞地说:Map还不够。

编辑:

当主要在没有 RPC 的 dart pad 中执行此操作时,它似乎工作正常,通过以下示例:https://dartpad.dartlang.org/3f6dc5779617ed427b75

这让我相信解析工具有问题,因为 dartpad 中的返回类型似乎允许返回 Map , Map<String, Object> ,和Map<String, dynamic> .

最佳答案

快速浏览一下 RPC 包自述文件 https://pub.dartlang.org/packages/rpc ,似乎标记为 Api 方法(使用 @ApiMethod)的方法应该返回具有简单字段的类的实例,例如:

class ResourceMessage {
  int id;
  String name;
  int capacity;
}

RPC 包将获取该实例并根据字段名称将其序列化为 JSON。

来自自述文件:

The MyResponse class must be a non-abstract class with an unnamed constructor taking no required parameters. The RPC backend will automatically serialize all public fields of the the MyResponse instance into JSON ...

您正在返回您希望 RPC 操作发出的 JSON 的嵌套 Map 表示,并且您会猜测 RPC 包不会按照您的预期处理它到。

回复:您的问题:

This leads me to believe something is wrong with the Parsing tool as it seems the return type in dartpad allows to return Map, Map, and Map.

您的示例中没有对 JSON 进行“解析”。您拥有的数据是一组嵌套文字 Dart MapListString,其结构与其派生的 JSON 相同从。它只是恰好看起来像 JSON。

在您的示例中,您只需选择并打印数据 map 的子 map (data['daily']),它会打印出结果的 String通过调用 toString() - 这是递归的,因此您可以获得其中所有嵌套映射和列表的内容。

所以这不是“深层复制”问题,而是 toString() 和 RPC 代码处理一组嵌套映射的方式不同。

顺便说一句:getDaily() 方法的返回类型并不重要。无论该方法声明的返回类型是什么,返回的都只是一个Map。请记住,Dart 中的类型是可选的,编辑器和编译器可以发现可能不正确的代码。请参阅https://www.dartlang.org/docs/dart-up-and-running/ch02.html#variables .

关于json - 我的 RCP 客户端未返回对象的深拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36163029/

相关文章:

php - json_decode() 返回错误 "Notice: Trying to get property of non-object"

firebase - 为什么 print(snapshot.hasData) 返回 true?

c - 即使使用 RPC_C_AUTHN_NONE,Windows RPC 访问也被拒绝

php - 在网络服务器中运行的后台服务如何通知客户端浏览器服务的进度?

json - 这是从 S3 : Spark 读取 Json 文件的最快方法

javascript - 以科学记数法将数字写入 JSON,这样它们就不会被引号括起来

javascript - 使用 JQUERY 根据 JSON 中的值突出显示表格单元格

flutter - 如何 SliverAppBar 始终显示阴影 - 扩展模式

flutter - 未处理的异常: 'List<dynamic>'类型不是'Map <String,dynamic'类型的子类型

Golang rpc获取错误的结构变量