首页 > 解决方案 > 在 .NET Core 2.1 中格式化 JSON 响应。将多个属性移动到单个枚举属性

问题描述

我想格式化我的 JSON 响应(删除敏感数据):

{
    "id": 252,
    "name": "PRODUCT NAME",
    "manufacturer": "PRODUCT MANUFACTURER",
    "sku": "PRODUCT SKU",
    "ean": "PRODUCT EAN",
    "departmentID": 42,
    "department": "DEPARTMENT NAME",
    "categoryID": 178,
    "category": "CATEGORY NAME",
    "price": 0.00,
    "msrp": 0.00,
    "inactive": true,
    "stock": 0,
    "weight": 0,
    "imgFull": "IMAGE URL",
    "extendedDescription": "PRODUCT DESCRIPTION"
}

为此(部门和类别移至第二维):

{
    "id": 252,
    "name": "PRODUCT NAME",
    "manufacturer": "PRODUCT MANUFACTURER",
    "sku": "PRODUCT SKU",
    "ean": "PRODUCT EAN",
    "Department": {
        "departmentID": 42,
        "department": "DEPARTMENT NAME"
    },
    "Category": {
        "categoryID": 178,
        "category": "CATEGORY NAME",
    },
    "price": 0.00,
    "msrp": 0.00,
    "inactive": true,
    "stock": 0,
    "weight": 0,
    "imgFull": "IMAGE URL",
    "extendedDescription": "PRODUCT DESCRIPTION"
}

这不仅是为了使响应更整洁,而且我想使用该方法添加额外的属性。例如,对于具有多个图像的产品,我想包含所有链接,而不仅仅是主链接。

产品类别是这样的:

public class apiProducts
{
    [Key]
    public Int32 Id { get; set; }
    [Required]
    public String Name { get; set; }
    [Required]
    public String Manufacturer { get; set; }
    [Required]
    public String SKU { get; set; }
    [Required]
    public String EAN { get; set; }
    [Required]
    public Int32 DepartmentID { get; set; }
    [Required]
    public String Department { get; set; }
    [Required]
    public Int32 CategoryID { get; set; }
    [Required]
    public String Category { get; set; }
    [Required]
    public Decimal Price { get; set; }
    [Required]
    public Decimal MSRP { get; set; }
    [Required]
    public Boolean Inactive { get; set; }
    [Required]
    public Int32 Stock { get; set; }
    [Required]
    public Double Weight { get; set; }
    [Required]
    public String ImgFull { get; set; }
    [Required]
    public String ExtendedDescription { get; set; }
}

根据我对 .NET Core 的有限理解,JSON 对象是直接从类格式化的,所以我不确定如何让类将多个属性推送到 Enum 中以按要求对其进行格式化。这可能是直截了当的(我希望如此),但我不知道用什么搜索词来找到答案:(如果这已经在其他地方得到了回答,我深表歉意。

标签: .netasp.net-coreasp.net-core-2.0asp.net-core-webapi

解决方案


事实证明这很简单。首先,我需要新类别/部门字段的对象:

public class apiProductDepartments
{
    [Key]
    public Int32 ID { get; set; }
    [Required]
    public String Name { get; set; }
}
public class apiProductCategories
{
    [Key]
    public Int32 ID { get; set; }
    [Required]
    public String Name { get; set; }
}

我们将它们添加到主产品类中,并将 Annotation 添加[IgnoreDataMember]到命名空间中的原始DepartmentID&DepartmentName属性(与CategoryID&相同CategoryNameSystem.Runtime.Serialization以将它们从 json 响应中删除(我们不需要两次属性,因此这将从json):

public class apiProducts
{
    [Key]
    public Int32 Id { get; set; }
    [Required]
    public String Name { get; set; }
    [Required]
    public String Manufacturer { get; set; }
    [Required]
    public String SKU { get; set; }
    [Required]
    public String EAN { get; set; }
    public apiProductDepartments Department { get; set; }
    [IgnoreDataMember]
    [Required]
    public Int32 DepartmentID { get; set; }
    [IgnoreDataMember]
    [Required]
    public String DepartmentName { get; set; }
    public apiProductCategories Category { get; set; }
    [IgnoreDataMember]
    [Required]
    public Int32 CategoryID { get; set; }
    [IgnoreDataMember]
    [Required]
    public String CategoryName { get; set; }
    [Required]
    public Decimal Price { get; set; }
    [Required]
    public Decimal MSRP { get; set; }
    [Required]
    public Boolean Inactive { get; set; }
    [Required]
    public Int32 Stock { get; set; }
    [Required]
    public Double Weight { get; set; }
    [Required]
    public String ImgFull { get; set; }
    [Required]
    public String ExtendedDescription { get; set; }
}

然后我们只需使用现有属性填充属性:

foreach(apiProducts p in results)
            {
                apiProductDepartments dept = new apiProductDepartments();
                apiProductCategories cat = new apiProductCategories();
                dept.ID = p.DepartmentID;
                dept.Name = p.DepartmentName;
                cat.ID = p.CategoryID;
                cat.Name = p.CategoryName;
                p.Department = dept;
                p.Category = cat;
            }

然后我们得到格式正确的响应:

{
    "id": PRODUCT ID,
    "name": "PRODUCT NAME",
    "manufacturer": "PRODUCT MANUFACTURER",
    "sku": "PRODUCT SKU",
    "ean": "PRODUCT EAN",
    "department": {
        "id": DEPARTMENT ID,
        "name": "DEPARTMENT NAME"
    },
    "category": {
        "id": CATEGORY ID,
        "name": "CATEGORY NAME"
    },
    "price": PRICE,
    "msrp": MSRP,
    "inactive": false,
    "stock": STOCK,
    "weight": WEIGHT,
    "imgFull": "IMAGE LINK",
    "extendedDescription": "EXTENDED DESC"
}

整洁多了!


推荐阅读