.net - 在 .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 中以按要求对其进行格式化。这可能是直截了当的(我希望如此),但我不知道用什么搜索词来找到答案:(如果这已经在其他地方得到了回答,我深表歉意。
解决方案
事实证明这很简单。首先,我需要新类别/部门字段的对象:
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
&相同CategoryName
)System.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"
}
整洁多了!
推荐阅读
- node.js - Angular 4 - Loopback 2“内部服务器错误”“对象(...)不是函数”
- pdo - 安装后未启用 PDO 驱动程序
- javascript - 如何导入 moment.js?
- python - Keras CNN 坐标回归仅给出平均值
- python - 如何使用可以更改的列表在多列上迭代矢量化 if/else 语句?
- docker - Visual Studio 解决方案中的多个 docker-compose .dcproj
- java - android - 'android.database.CursorIndexOutOfBoundsException: 请求索引 0,大小为 0'
- javascript - 带有地图的Javascript箭头函数
- r - 将绘图与高度可变的宽度相结合
- linux - 使用 find 和 tar 复制文件