Схема GraphQL, эквивалентная этому Json?

Я новичок в 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<java.lang.String, com.grapql.research.domain.FldDef> 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).


person Simple-Solution    schedule 06.12.2017    source источник


Ответы (2)


дать вам схему из вашего JSON на самом деле невозможно, потому что схема содержит гораздо больше информации, чем просто форма ваших данных. Я думаю, что лучше всего для вас было бы изучить основы GraphQL, тогда разработка простых схем будет очень легкой и увлекательной! Можете начать с раздела обучения на graphql.org. У них есть раздел о схеме. В основном вы строите свою схему из скаляров (они же примитивы) и типов объектов. Все типы могут быть дополнительно обернуты в необнуляемый тип и/или тип списка. GraphQL был разработан для клиентов. Самый простой способ понять GraphQL — выполнить несколько запросов к существующему API. Launchpad содержит множество примеров, которые вы можете использовать (и изменять, если немного знаете JavaScript).

person Herku    schedule 07.12.2017
comment
Спасибо за ответ, я знаю основы. Я также обновил свой вопрос, чтобы он дал вам больше контекста! - person Simple-Solution; 07.12.2017
comment
К сожалению, я работал только с реализациями Node.js и Scala GraphQL. Во-первых: ваша схема выглядит хорошо, но вам понадобится тип запроса, который предлагает точку входа в систему. Второе: в GraphQL нет карт! Вместо этого вы должны использовать список с идентификаторами или ключами. сделать fldDef для продукта список, например [FldDef!]! и, возможно, тип списка (например, список массивов) в Java. - person Herku; 07.12.2017

Вы можете попробовать некоторые изменения, как показано ниже:

Определение схемы:

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
}

Надеюсь, это поможет.

person Nic Olas    schedule 07.12.2017
comment
Спасибо, я знаю это, но это не ответ, а скорее предложение или комментарий! Решение состоит в том, чтобы реализовать CustomScalar для карты, что я и реализовал! - person Simple-Solution; 07.12.2017
comment
Я бы настоятельно рекомендовал не использовать пользовательское скалярное решение, поскольку вы теряете статически типизированное свойство GraphQL и возможность определять подвыборки, что является причиной, по которой вы в первую очередь используете GraphQL. - person Herku; 10.12.2017