java - 如何比较具有不同顺序元素的Json数组
问题描述
我有 2 个 API 响应并将它们转换为 Json 数组。当我将 2 个 json 转换为键值对映射时,值的顺序不同,无法在 2 个 API 响应之间进行比较。
API 1 中的 JsonArray:
[
{
"employeeSalutation": null,
"EmployeeName": "Example",
"EmployeeCode": "SAA",
"Zip": 12345,
"DepartmentName": "Social science",
"EmployeeAddress": "123 st",
"StateCode": 9,
"updatedDate": "2018-01-22T03:48:43.59",
"EmployeeId": 1257
}
]
API 2 中的 Json 数组:
[
{
"Emp_Name": "Example",
"emp_Sal": null,
"Dept_Name": "Social science",
"Emp_addr": "123 st",
"Zip": "12345",
"Stat_cd": 9,
"Emp_id": 1257,
"upd_d": "2018-01-22 03:48:43.59",
"Emp_Code": "SAA"
}
]
我将 2 个 Json 数组转换为键值对映射,其中 EmployeeId 作为数组 1 中的键,Emp_id 作为数组 2 中的键。当我比较 2 个映射时,映射中的值顺序不同并且失败。
如何比较 2 个 API 以确保 2 个 api 中每个元素的值匹配。
解决方案
首先,您需要创建一个代表这两个JSON
有效负载的模型。除了键名和键值之外,它们几乎相似Zip
,在第一个有效负载中它是第二个String
原始数字中的数字原语。日期也有不同的格式,因此您需要通过实现自定义日期反序列化器来处理它们。
当然,您应该使用Jackson或Gson库,它们允许反序列JSON
化POJO
建模、提供自定义日期反序列化器以及任何其他许多功能。
以下示例提供示例解决方案:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.annotations.SerializedName;
import com.google.gson.reflect.TypeToken;
import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Objects;
public class GsonApp {
public static void main(String[] args) throws Exception {
File jsonApi1 = new File("./resource/test.json").getAbsoluteFile();
File jsonApi2 = new File("./resource/test1.json").getAbsoluteFile();
Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
private final SimpleDateFormat formatWithTimeZoneIndicator = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SS");
private final SimpleDateFormat formatWithoutTimeZoneIndicator = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SS");
@Override
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
String date = json.getAsString();
try {
return formatWithoutTimeZoneIndicator.parse(date);
} catch (ParseException e) {
try {
return formatWithTimeZoneIndicator.parse(date);
} catch (ParseException e1) {
throw new JsonParseException(e1);
}
}
}
})
.create();
Type employeesType = new TypeToken<List<Employee>>() {}.getType();
try (FileReader readerApi1 = new FileReader(jsonApi1);
FileReader readerApi2 = new FileReader(jsonApi2)) {
List<Employee> employees1 = gson.fromJson(readerApi1, employeesType);
List<Employee> employees2 = gson.fromJson(readerApi2, employeesType);
System.out.println(employees1);
System.out.println(employees2);
System.out.println(employees1.equals(employees2));
}
}
}
class Employee {
@SerializedName(value = "employeeSalutation", alternate = {"emp_Sal"})
private String employeeSalutation;
@SerializedName(value = "EmployeeName", alternate = {"Emp_Name"})
private String employeeName;
@SerializedName(value = "EmployeeCode", alternate = {"Emp_Code"})
private String employeeCode;
@SerializedName("Zip")
private JsonPrimitive zip;
@SerializedName(value = "DepartmentName", alternate = {"Dept_Name"})
private String departmentName;
@SerializedName(value = "EmployeeAddress", alternate = {"Emp_addr"})
private String employeeAddress;
@SerializedName(value = "StateCode", alternate = {"Stat_cd"})
private int stateCode;
@SerializedName(value = "updatedDate", alternate = {"upd_d"})
private Date updatedDate;
@SerializedName(value = "EmployeeId", alternate = {"Emp_id"})
private int employeeId;
public String getEmployeeSalutation() {
return employeeSalutation;
}
public void setEmployeeSalutation(String employeeSalutation) {
this.employeeSalutation = employeeSalutation;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getEmployeeCode() {
return employeeCode;
}
public void setEmployeeCode(String employeeCode) {
this.employeeCode = employeeCode;
}
public JsonPrimitive getZip() {
return zip;
}
public void setZip(JsonPrimitive zip) {
this.zip = zip;
}
public String getDepartmentName() {
return departmentName;
}
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
public String getEmployeeAddress() {
return employeeAddress;
}
public void setEmployeeAddress(String employeeAddress) {
this.employeeAddress = employeeAddress;
}
public int getStateCode() {
return stateCode;
}
public void setStateCode(int stateCode) {
this.stateCode = stateCode;
}
public Date getUpdatedDate() {
return updatedDate;
}
public void setUpdatedDate(Date updatedDate) {
this.updatedDate = updatedDate;
}
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
return stateCode == employee.stateCode &&
employeeId == employee.employeeId &&
Objects.equals(employeeSalutation, employee.employeeSalutation) &&
Objects.equals(employeeName, employee.employeeName) &&
Objects.equals(employeeCode, employee.employeeCode) &&
Objects.equals(zip.getAsString(), employee.zip.getAsString()) &&
Objects.equals(departmentName, employee.departmentName) &&
Objects.equals(employeeAddress, employee.employeeAddress) &&
Objects.equals(updatedDate, employee.updatedDate);
}
@Override
public int hashCode() {
return Objects.hash(employeeSalutation, employeeName, employeeCode, zip, departmentName, employeeAddress, stateCode, updatedDate, employeeId);
}
@Override
public String toString() {
return "Employee{" +
"employeeSalutation='" + employeeSalutation + '\'' +
", employeeName='" + employeeName + '\'' +
", employeeCode='" + employeeCode + '\'' +
", zip=" + zip +
", departmentName='" + departmentName + '\'' +
", employeeAddress='" + employeeAddress + '\'' +
", stateCode=" + stateCode +
", updatedDate='" + updatedDate + '\'' +
", employeeId=" + employeeId +
'}';
}
}
上面的代码打印:
[Employee{employeeSalutation='null', employeeName='Example', employeeCode='SAA', zip=12345, departmentName='Social science', employeeAddress='123 st', stateCode=9, updatedDate='Mon Jan 22 03:48:43 CET 2018', employeeId=1257}]
[Employee{employeeSalutation='null', employeeName='Example', employeeCode='SAA', zip="12345", departmentName='Social science', employeeAddress='123 st', stateCode=9, updatedDate='Mon Jan 22 03:48:43 CET 2018', employeeId=1257}]
true
推荐阅读
- heroku - 如何将使用@nuxtjs/apollo 模块的nuxt 应用程序部署到heroku?
- java - 文件名在 Android Studio 的 TextView 中显示不正确
- php - 如何在本地服务器 Xampp 上添加对 PUT 和 DELETE 方法的支持
- python - 如何构建 Flask + Reactjs 项目
- sql - 在 oracle apex 中遇到符号“=”
- javascript - 映射 JSON 字段
- ios - 自定义单元格未在 UITabelView 中显示数据未使用情节提要
- powerbi - 如何编写一个度量来显示总数的百分比?
- php - 如何在选择选项中隐藏提前 4 小时
- c# - 为什么附件不显示在使用 Mimekit 发送的电子邮件中?