Asp.net 使用GraphQL和热巧克力将IDictionary序列化为动态JSON

Asp.net 使用GraphQL和热巧克力将IDictionary序列化为动态JSON,asp.net,graphql,hotchocolate,Asp.net,Graphql,Hotchocolate,我正在使用Web API将Hot ChocketGraphQL添加到现有的ASP.Net核心项目中,并重用Web API使用的模型。 其中一个模型具有IDictionary属性,该属性通过Web API序列化为动态JSON 模型 public class Theme { ... public IDictionary<string, object> Styles { get; set; } ... } 对于热巧克力,我正在重用该模型,并在启动时添加GraphQ

我正在使用Web API将Hot ChocketGraphQL添加到现有的ASP.Net核心项目中,并重用Web API使用的模型。 其中一个模型具有IDictionary属性,该属性通过Web API序列化为动态JSON

模型

public class Theme
{
    ...
    public IDictionary<string, object> Styles { get; set; }
    ...
}
对于热巧克力,我正在重用该模型,并在启动时添加GraphQL

services.AddGraphQL(sp => SchemaBuilder.New()
    .AddServices(sp)
    .AddQueryType(d => d.Name("Query"))
    ...
    .AddType<Theme>()
    .Create());
并且只能检索密钥

{
  themes(...) {
    edges {
      node {
        name
        styles{
          key
        }
      }
    }
  }
}
有以下回应:

{
  "themes": {
    "edges": [
      {
        "node": {
          ...
          "styles": [
            {
              "key": "header"
            },
            {
              "key": "borderRadius"
            },
            ...
          ]
        }
      }
    ]
  }
}
我想设置Hot Chocolate,以使编写GraphQL查询成为可能,该查询提供与Web API相同的动态结果

更新

源是一个JSON字符串,该字符串被反序列化到具有


问题是生成的字典没有递归地序列化到字典。

热巧克力有一个AnyType用于动态数据结构。但是默认情况下,AnyType不是从类型隐式推断的

这里基本上有两种选择。使用属性在您的类型上声明类型,或者使用fluent API执行相同的操作

纯代码优先:

公开课主题 { ... [图形QLtypeOfAnyType] 公共IDictionary样式{get;set;} ... } 首先使用架构类型编写代码:

公共类ThemeType:ObjectType { 受保护的覆盖无效配置IObjectTypeDescriptor描述符 { descriptor.Fieldt=>t.Styles.Type; } } 或者,您可以说在模式中,所有IDictionary都是任何类型,在这种情况下,您不需要显式定义类型:

services.AddGraphQLsp=>schemabilder.New .AddServicessp .AddQueryTyped=>d.NameQuery ... .AddType .bindclutype 创造
我希望这会有所帮助。

首先,我确保使用此答案将所有字典反序列化到字典,然后纯代码优先和模式类型的代码优先都可以完美地工作。
{
  themes(...) {
    edges {
      node {
        name
        styles{
          key
        }
      }
    }
  }
}
{
  "themes": {
    "edges": [
      {
        "node": {
          ...
          "styles": [
            {
              "key": "header"
            },
            {
              "key": "borderRadius"
            },
            ...
          ]
        }
      }
    ]
  }
}
var jsonString = "{\"header\":{\"color\":\"#fff\"},\"borderRadius\":\"4px\"}";

theme.Styles = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString);