asp.net-mvc - 如何通过将子对象附加到每个父对象来创建 Json 响应
问题描述
Table1: [Building]([ID] [uniqueidentifier] NOT NULL,
[BuildingCode] [varchar](50) NULL,
[Name] [varchar](max) NULL,
[RoleID] [uniqueidentifier] NOT NULL, )
二表子表设计是这样的
Table2: [Role](
[RoleID] [uniqueidentifier] NOT NULL,
[Name] [varchar](max) NULL)
现在,我想要的响应是这样的:
BuildingCode1
{
RoleId:16C6BEA4-421A-4718-8B85-090FC2FD8BCF
Name:Role Name 1
},
BuildingCode2
{
RoleId:2HJ44A4-621A-A718-8B85-P90FC2FD8BCF
Name:Role Name 2
},
BuildingCode3
{
RoleId:KJL34J8-621A-A718-8B85-3FH39DKF48
Name:Role Name 3
}
对于表 1 中的每个建筑代码,从表 2(角色)中获取相关的角色 ID 详细信息。请帮助我怎样才能得到这种回应。在此先感谢我为此创建了 2 个课程
public class BCode_Role
{
public RoleTable[] BuildingCode { get; set; }
public byte Status { get; set; }
}
public class RoleTable
{
public Guid RoleID { get; set; }
public string Name { get; set; }
}
返回 json 的方法是
public Bcode_Role BuldingDetail()
{
var result = new BuildingCode_Role();
var dbBuildingCods = _context.Building.Select(x => x.Code);
var dbRoles = _context.Role;
var apiModels = dbRoles.Select(x => new RoleTable {RoleID= x.ID, Name = x.Name }).ToArray();
result.BuildingCode = apiModels;
return result;
}
形成这个我得到这个Json输出
{
"buildingCode": [
{
"roleID": "0f752579-57cc-4266-a4b4-4759af97525e",
"name": "Role 2"
},
{
"roleID": "1914a479-cb75-48b9-b5c3-6792acfba7b3",
"name": "Role 1"
},
{
"roleID": "3bc21132-079d-4ab9-b9f5-fe2428a281f1",
"name": "Role 3"
}
],
"status": 0
}
但实际上我想要
{
"buildingCode1": {
"roleID": "0f752579-57cc-4266-a4b4-4759af97525e",
"name": "Role 2"
},
"buildingCode"2: {
"roleID": "1914a479-cb75-48b9-b5c3-6792acfba7b3",
"name": "Role 1"
},
"buildingCode"3: {
"roleID": "3bc21132-079d-4ab9-b9f5-fe2428a281f1",
"name": "Role 3"
},
}
解决方案
为了实现这一点,我建议你改变你的 BCode_Role 类如下
public class BCode_Role
{
[JsonProperty("buildingCode")]
[JsonExtensionData]
public IDictionary<string,object> BuildingCode{get;set;}
public byte Status { get; set; }
}
public class RoleTable
{
[JsonProperty("roleID")]
public Guid RoleID { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
}
然后在您的 BuldingDetail 方法中,
public Bcode_Role BuldingDetail()
{
var result = new BuildingCode_Role();
var dbBuildingCods = _context.Building.Select(x => x.Code);
var dbRoles = _context.Role;
var apiModels = dbRoles.Select(x => x).AsEnumerable().Select((x,index) => new {Key = $"{nameof(BCode_Role1.BuildingCode)}{index}", Value = (object)new RoleTable {RoleID= x.ID, Name = x.Name }}).ToDictionary(x=>x.Key,y=>y.Value);
result.BuildingCode = apiModels;
return result;
}
序列化结果会给
{
"Status": 0,
"BuildingCode0": {
"roleID": "0f752579-57cc-4266-a4b4-4759af97525e",
"name": "Role 2"
},
"BuildingCode1": {
"roleID": "1914a479-cb75-48b9-b5c3-6792acfba7b3",
"name": "Role 1"
},
"BuildingCode2": {
"roleID": "3bc21132-079d-4ab9-b9f5-fe2428a281f1",
"name": "Role 3"
}
}
推荐阅读
- excel - 如何通过 INDIRECT 函数从另一张表中引用数据透视表值?
- python - Adding a second to time for every cell in an excel file, store each time in an array
- javascript - Google 表格脚本 - 太慢了
- r - 通过 `map()` 传递名称以进行延迟评估
- azure - Microsoft Chatbot - 在 Azure 上部署后,“向您的机器人发送此消息时出错:HTTP 状态代码已禁止”
- powershell - 使用powershell更改CSV中单个单元格的时间
- javascript - 如何递归地将嵌套对象数组转换为平面对象数组?
- forms - Xamarin 表单 XAML 设计实例
- aws-lambda - CDK 部署既不更新我的 CoudFormation 模板,也不部署更新
- hyperledger-fabric - HyperLedger Fabric 中是否有排序程序调度方式?