Asp.net 使用GraphQL和热巧克力将IDictionary序列化为动态JSON
我正在使用Web API将Hot ChocketGraphQL添加到现有的ASP.Net核心项目中,并重用Web API使用的模型。 其中一个模型具有IDictionary属性,该属性通过Web API序列化为动态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
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);