使用GraphQL和Gatsby导入具有动态字段的JSON

时间:2019-06-27 14:48:26

标签: json graphql gatsby

我正在尝试使用 gatsby-transformer-json 导入包含产品类别的JSON文件,其中包含多个产品,这些产品的字段根据其所在的类别具有动态子字段。其中有数百个不同的类别,因此我想使这些子字段(如“属性”)保持动态。它们也可能随时间变化。客户端逻辑将处理此问题。

不幸的是,GraphQL只让我明确查询字段,而查询需要知道所有子字段。

这是JSON:

{
    "name": "Car Hifi",
    "categorydesc": "This should be a very long text",
    "products": [{
            "name": "JVC KW-DB93BT",
            "attributes": {
                "Has USB": "JVC",
                "compatible formats": {},
                "Hands free": "true"
            },
            "advantages": {
                "0": "More bass",
                "1": "Less power consumption",
                "2": "Simple UI"
            }
        }
    ]
}

这是一个查询:

query MyQuery {
  dataJson {
    name
    categorydesc
    products {
      name
      attributes {
        // This should be dynamic
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

我能想到的一种解决方案是修改attributes使其变为数组:

// from this
{
  "attributes": {
    "Has USB": "JVC",
    "compatible formats": {},
    "Hands free": "true"
  }
}

// to this
{
  "attributes": [
    {"label": "Has USB", "value": "JVC" },
    {"label": "compatible formats", "value": {} },
    {"label": "Hands free", "value": true },
  ]
}

然后您可以查询它:

query {
  dataJson {
    products {
      name
      attributes {
        label
        value
      }
    }
  }
}

不幸的是,gatsby-transformer-json并不那么灵活,我想如果您想走这条路,最好编写自己的源插件(听起来并不那么困难),以转换{{1} }字段,然后再将数据提供给盖茨比的attributes

文档中的一些相关链接: