相当于这个 Json 的 GraphQL 模式?

Posted

技术标签:

【中文标题】相当于这个 Json 的 GraphQL 模式?【英文标题】:GraphQL schema equivalent of this Json? 【发布时间】:2018-05-20 12:03:42 【问题描述】:

我是 GraphQL 的新手,想知道是否有人可以帮我弄清楚以下 JSON 到 GraphQL 架构中的等效项:

[
 
   "id": "1",
   "name": "A",
   "fldDef": [
    
      "name": "f1",
      "type": "str",
      "opt": false
    ,
    
      "name": "f2",
      "type": "bool"
    ]
 ,
 
    "id": "2",
    "name": "B",
    "fldDef": [
     
       "name": "f3",
       "type": "str",
       "opt": true
     ,
     
       "name": "f4",
       "type": "str",
       "opt": true
     ]
  
]

到目前为止,我设法将上面的响应映射到下面的对象:

  public class FldDef 

     private String name, type;
     private boolean opt;
     // getters & setters
  

 public class Product 

    private String id, name;
    private Map<String, FldDef> fldDef;

   // getters & setters

 

然后我的架构如下所示,但我遇到的问题是作为Product 对象的一部分,我有一个Map,我想获得适合它的架构,但我难以获得正确的架构!

type FldDef  
   name: String!
   type: String!
   opt: Boolean!
 

type Product 
   id: String!
   name: String!
   fldDef: FldDef! // now here I don't know what is the syntax for representing MAP, do you know how to achieve this?
 

我得到以下异常:

Causedby:com.coxautodev.graphql.tools.TypeClassMatcher$RawClassRequiredForGraphQLMappingException: Type java.util.Map&lt;java.lang.String, com.grapql.research.domain.FldDef&gt; cannot be mapped to a GraphQL type! Since GraphQL-Java deals with erased types at runtime, only non-parameterized classes can represent a GraphQL type. This allows for reverse-lookup by java class in interfaces and union types.

注意:我正在使用 Java 生态系统 (graphql-java)

【问题讨论】:

【参考方案1】:

您可以尝试以下更改:

架构定义:

type FldDef 
   name: String!
   type: String!
   opt: Boolean!


type Product 
   id: String!
   name: String!
   fldDef: [FldDef]! // make it as Collection of FldDef
 

Java 类:

public class FldDef 

    private String name;
    private String type;
    private boolean opt;
    // getters & setters


public class Product 

    private String id;
    private String name;
    private List<FldDef> fldDef; // Change to List of FldDef
    // getters & setters

希望对你有帮助。

【讨论】:

谢谢,我知道,但这不是答案,而是建议或评论!一个解决方案是为 Map 实现一个 CustomScalar,我已经实现了它! 我强烈建议不要使用自定义标量解决方案,因为您失去了 GraphQL 的静态类型属性和定义子选择的能力,这就是您首先使用 GraphQL 的原因。【参考方案2】:

从您的 JSON 中为您提供架构实际上是不可能的,因为架构包含的信息远不止简单的数据形状。我认为最适合你的是学习 GraphQL 的基础知识,这样设计简单的模式就非常容易和有趣!也许从graphql.org 的学习部分开始。他们有一个关于schema 的部分。基本上,您从标量(又名原语)和对象类型构建您的模式。所有类型都可以另外包装在不可为空的类型和/或列表类型中。 GraphQL 是为客户设计的。理解 GraphQL 的最简单方法是对现有 API 进行一些查询。 Launchpad 有很多示例可供您使用(并且在您了解一些 javascript 时进行修改)。

【讨论】:

感谢回复,基本都知道了。我还更新了我的问题,以便为您提供更多背景信息! 不幸的是,我只使用过 Node.js 和 Scala GraphQL 实现。首先:您的架构看起来不错,但您需要一个提供系统入口点的查询类型。第二:GraphQL 没有地图!相反,您将使用带有 ID 或键的列表。将 Product 上的 fldDef 设为列表,就像 [FldDef!]! 一样,并且可能是 Java 中的列表类型(如数组列表)。

以上是关于相当于这个 Json 的 GraphQL 模式?的主要内容,如果未能解决你的问题,请参考以下文章

来自 Gatsby 中单个对象 JSON 文件的 GraphQL 模式

从 json api 响应生成 Graphql 模式

使用 GraphQl 返回无模式对象? [复制]

GraphQL 按键值过滤数据(例如,用户年龄必须为 31)

有没有办法从 protobuf 生成 GraphQL 模式?

如果它们来自数据源,如何在 graphql 模式中表示枚举?