首页 > 解决方案 > 如何通过将子对象附加到每个父对象来创建 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"
                       },
    }

标签: asp.net-mvcentity-frameworklinqwebasp.net-web-api2

解决方案


为了实现这一点,我建议你改变你的 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"
  }
}

推荐阅读