C#编写GraphQL查询返回结果属性首字母小写问题求助
问题
用C#编写GraphQL查询,Schema已创建且能正常获取数据,但返回结果中属性名首字母会自动转为小写。
Schema代码:
var schema = Schema.For(@" type user { Indx: Int, UserName: String, Password: String } type Query { users: [user] } ", s => s.Types.Include<Query>());
执行查询(能返回数据但属性首字母小写):
var json = schema.ExecuteAsync( s => { s.Query = "{ users {indx,userName,password} }"; });
返回结果:
{ "data": { "users": [ { "indx": 593, "userName": "string", "password": "string" }, { "indx": 540, "userName": "new test user", "password": "1234" }, { "indx": 598, "userName": "wolv", "password": "1234" } ] } }
若改用首字母大写的字段查询:
var json = schema.ExecuteAsync( s => { s.Query = "{ users {Indx,UserName,Password} }"; });
会返回错误:
{ "errors": [ { "message": "Cannot query field 'Indx' on type 'user'. Did you mean 'indx'?", "locations": [ { "line": 1, "column": 10 } ], "extensions": { "code": "FIELDS_ON_CORRECT_TYPE", "codes": [ "FIELDS_ON_CORRECT_TYPE" ], "number": "5.3.1" } }, { "message": "Cannot query field 'UserName' on type 'user'. Did you mean 'userName'?", "locations": [ { "line": 1, "column": 15 } ], "extensions": { "code": "FIELDS_ON_CORRECT_TYPE", "codes": [ "FIELDS_ON_CORRECT_TYPE" ], "number": "5.3.1" } }, { "message": "Cannot query field 'Password' on type 'user'. Did you mean 'password'?", "locations": [ { "line": 1, "column": 24 } ], "extensions": { "code": "FIELDS_ON_CORRECT_TYPE", "codes": [ "FIELDS_ON_CORRECT_TYPE" ], "number": "5.3.1" } } ] }
期望返回结果(属性首字母大写):
{ "data": { "users": [ { "Indx": 593, "UserName": "string", "Password": "string" }, { "Indx": 540, "UserName": "new test user", "Password": "1234" }, { "Indx": 598, "UserName": "wolv", "Password": "1234" } ] } }
解决方案
方法1:全局禁用驼峰命名转换
GraphQL.NET默认会将Schema字段名转换为驼峰格式,通过配置NameConverter为DefaultNameConverter可以保留原始字段名:
var schema = Schema.For(@" type user { Indx: Int, UserName: String, Password: String } type Query { users: [user] } ", s => { s.Types.Include<Query>(); // 保留原始字段名,不做驼峰转换 s.NameConverter = new DefaultNameConverter(); });
之后使用首字母大写的字段名查询:
var json = schema.ExecuteAsync( s => { s.Query = "{ users {Indx,UserName,Password} }"; });
返回的JSON结果字段名将与Schema定义一致,保持首字母大写。
方法2:为单个字段指定输出名称
如果不需要全局修改,可使用@name指令为每个字段指定输出的JSON键名:
var schema = Schema.For(@" type user { indx: Int @name(name: ""Indx""), userName: String @name(name: ""UserName""), password: String @name(name: ""Password"") } type Query { users: [user] } ", s => s.Types.Include<Query>());
查询时仍使用小写字段名:
var json = schema.ExecuteAsync( s => { s.Query = "{ users {indx,userName,password} }"; });
返回的JSON结果中字段名将是指定的大写格式。
内容的提问来源于stack exchange,提问作者Marwan Abu Ahmad
相关产品推荐
相关产品推荐

