TIL: Returning a JSON Field From Rails GraphQL
April 28, 2020
Sometimes a key in your GraphQL response needs to be a JSON object, and you can't define it in any greater granularity. This is often the case when the object's keys are different depending on specific logic rules. I had this exact problem today. The simplest way to deal with this is to define a custom JSON type in a separate module. You might end up with a few of these for various custom data types over time, so it's good to start a graph_utils/types folder to keep them together:
| module GraphqlUtils::Types | |
| Json = GraphQL::ScalarType.define do | |
| name 'JSON' | |
| description 'JSON type' | |
| end | |
| end |
Then, when you define your field types for your GraphQL response, use:
| field :aJSONField, | |
| GraphqlUtils::Types::Json, | |
| 'A field with freeform JSON data', | |
| property: :a_json_field |
Now the aJSONField key can contain any JSON data, of any shape. This is a surprisingly common use case in the project I'm currently working on.