json - 在 Flutter 的 Ferry Graphql 中序列化标量 JSON 以实现灵活的查询

标签 json flutter graphql jsonserializer

我有以下 JSON 标量:

"""
The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf).
"""
scalar JSON

我正在尝试转换它,因为我的查询正在接受输入:JSON。使用 graphql Playground 进行测试时,查询是 JSON 对象,因此可以执行以下操作:

query {
  carts(where: {
    owner:{id: "xxx"}
    store:{name: "yyy"}
  }) {
    id
  }
}
# query is the starting from the where: {...}
# build.yaml
# build.yaml
gql_build|schema_builder: #same for gql_build|schema_builder + gql_build|var_builder + ferry_generator|req_builder:
  options:
          type_overrides:
            DateTime:
              name: DateTime
            JSON:
              name: BuiltMap<String, dynamic>
              import: 'package:built_collection/built_collection.dart'
gql_build|serializer_builder:
        enabled: true
        options:
          schema: myapp|lib/graphql/schema.graphql
          custom_serializers:
            - import: 'package:myapp/app/utils/builtmapjson_serializer.dart'
              name: BuiltMapJsonSerializer

这是自定义序列化器(builtmapjson_serializer.dart)

//// lib/app/utils/builtmapjson_serializer.dart
import 'package:built_collection/built_collection.dart';
import "package:gql_code_builder/src/serializers/json_serializer.dart";

class BuiltMapJsonSerializer extends JsonSerializer<BuiltMap<String, dynamic>> {
  @override
  BuiltMap<String, dynamic> fromJson(Map<String, dynamic> json) {
    print('MyJsonSerializer fromJson: $json');
    return BuiltMap.of(json);
  }

  @override
  Map<String, dynamic> toJson(BuiltMap<String, dynamic> operation) {
    print('MyJsonSerializer toJson: ${operation.toString()}');
    return operation.asMap();
  }
}

以及用法:

Future testQuery() async {
    Map<String, dynamic> queryMap = {
      "where": {
        "owner": {
          "id": "xxx",
          "store": {"name": "yyy"}
        }
      }
    };
    final req = GFindCartsReq((b) {
      return b..vars.query.addAll(queryMap);
    });
    var resStream = _graphQLService.client.request(req);
    var res = await resStream.first;
    print(
        'linkExceptions: ${res.linkException}'); // Map: LinkException(Bad state: No serializer for '_InternalLinkedHashMap<String, Map<String, Object>>'.)
  }

因此,每当我尝试查询时,它都会抛出最后一行用法的注释中指出的 linkException 。知道序列化它的方式应该是什么吗?

最佳答案

// Write query like this
query FindCarts($owner_id: String!, $store_name: String!) {
  carts(where: {
    owner:{id: $owner_id}
    store:{name: $store_name}
  }) {
    id
  }
}
// And make request like this:
final req = GFindCartsReq((b) => b..vars.store_name = 'XXX'..vars.owner_id = 'YYY');

我认为您可能误解了用例。如果您想最终得到与 graphql 表示不同的 Dart 对象,它们可以序列化和反序列化响应。您可能想尝试重读本节: https://ferrygraphql.com/docs/custom-scalars/#create-a-custom-serializer

在文档的示例中,graphql 模式返回一个 int 作为时间戳,但我们想要实际使用 Date 对象,所以这就是序列化器的目的。它告诉渡轮反序列化我们对 Date 的响应中的 int ,以便我们可以在 dart 代码中使用 Date 。您仍然可以使用 json 序列化器(就像您链接到的示例中一样),但它仍然不会以您尝试使用它的方式出现——如果您的模式返回一个 json 字符串并且您想要反序列化json 字符串。例如,就我而言,我的 graphql 架构实际上确实在某些对象上返回“jsonb”类型。为了处理这个问题,我使用built_value的默认json_object,如下所示:

(
...
          type_overrides:
            jsonb:
              name: JsonObject
              import: "package:built_value/json_object.dart"
          custom_serializers:
            - import: "package:built_value/src/json_object_serializer.dart"
              name: JsonObjectSerializer

关于json - 在 Flutter 的 Ferry Graphql 中序列化标量 JSON 以实现灵活的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70320139/

相关文章:

c# - .NET 中的 SCIM 反序列化问题

javascript - 尝试在 https ://api. thetvdb.com/向 TVDB REST API 发出 JSON POST 请求,但收到 CORS 错误

java - org.json.JSONException : End of input at character 0 of

php - 如何从 MySQL 获取 JSON 信息

sql - flutter -sqflite : How to change the order (index) of the persisted data?

sql - 在 SQL 表中有一个专用的计数字段是否可取?

javascript - 你如何使用 graphql-js 定义片段?

flutter - 使用 Firebase 是否可以防止两个人同时将产品添加到购物车?

dart - 按下按钮时如何添加小部件

reactjs - React-Apollo Mutation 返回空响应