如何使用 Java 处理 JSON
How to process a JSON using Java
我在服务器端将 JSON 字符串 (inputJson) 传递到我的 java 代码 (PPProgramAddView)。
PPProgramAddView:
inputJson: [{"ppl_row":0,"ppl_time":"07:00","ppat_id":"Mw==","ppa_id":"MTI=","ppl_LeadAssist":"Lead"},{"ppl_row":1,"ppl_time":"07:10","ppat_id":"Mg==","ppa_id":"NA==","ppl_LeadAssist":"Assist"}]
当我尝试处理它时出现以下错误:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "ppl_row" (class client.Profile14), not marked as ignorable (5 known properties: "plTime", "plActivity", "plActivityType", "plRow", "plLeadAssist"])
at [Source: (String)"[{"ppl_row":0,"ppl_time":"07:00","ppat_id":"Mw==","ppa_id":"MTI=","ppl_LeadAssist":"Lead"},{"ppl_row":1,"ppl_time":"07:10","ppat_id":"Mg==","ppa_id":"NA==","ppl_LeadAssist":"Assist"}]"; line: 1, column: 14] (through reference chain: java.lang.Object[][0]->client.Profile14["ppl_row"])
at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61)
我进行了搜索,但在任何地方都找不到“plTime”、“plActivity”、“plActivityType”、“plRow”、“plLeadAssist”。
我的代码是:
//Look through the new program lines and add them.
try {
ObjectMapper mapper = new ObjectMapper();
Profile14[] profiles14 = mapper.readValue(inputJson, Profile14[].class);
for (final Profile14 programLine : profiles14) {
String ppl_row = programLine.getplRow();
String ppl_time = null;
if (programLine.getplTime().length() < 1){
ppl_time = "00:01";
}else{
ppl_time = programLine.getplTime();
}
String ppat_id_encoded = programLine.getplActivityType();
String ppa_id_encoded = programLine.getplActivity();
String ppl_LeadAssist = programLine.getplLeadAssist().substring(0, Math.min(programLine.getplLeadAssist().length(), 45));
byte[] valueDecoded3 = Base64.decodeBase64(ppat_id_encoded);//decoding part
String ppat_id = new String(valueDecoded3);
byte[] valueDecoded4 = Base64.decodeBase64(ppa_id_encoded);//decoding part
String ppa_id = new String(valueDecoded4);
System.out.println("ppID: " + ppID + " ppat_id: " + ppat_id + " ppa_id: " + ppa_id +
" ppl_row : " + ppl_row + " ppl_time: " + ppl_time + " ppl_LeadAssist: " + ppl_LeadAssist);
MySQLConnection.addPPProgramLine(ppID, ppat_id, ppa_id, ppl_row, ppl_time, ppl_LeadAssist);
}
} catch (Exception e) {
e.printStackTrace();
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Error.");
}
}
}
class Profile14 {
private String ppl_row;
private String ppl_time;
private String ppat_id;
private String ppa_id;
private String ppl_LeadAssist;
public String getplRow() {
return ppl_row;
}
public void setplRow(String ppl_row) {
this.ppl_row = ppl_row;
}
public String getplTime() {
return ppl_time;
}
public void setplTime(String ppl_time) {
this.ppl_time = ppl_time;
}
public String getplActivityType() {
return ppat_id;
}
public void setplActivityType (String ppat_id) {
this.ppat_id = ppat_id;
}
public String getplActivity() {
return ppa_id;
}
public void setplActivity(String ppa_id) {
this.ppa_id = ppa_id;
}
public String getplLeadAssist() {
return ppl_LeadAssist;
}
public void setplLeadAssist(String ppl_LeadAssist) {
this.ppl_LeadAssist = ppl_LeadAssist;
}
@Override
public String toString() {
return "Profile14 [ppl_row=" + ppl_row + ", ppl_time=" + ppl_time + ", ppat_id=" + ppat_id
+ ", ppa_id=" + ppa_id + ", ppl_LeadAssist=" + ppl_LeadAssist + "]";
}
}
您没有遵循 JavaBean 标准,如果没有明确的说明,Jackson 不知道如何映射您的 class。
Java 约定是将属性命名为 pplRow
,而您的 JSON 使用 ppl_row
的替代 Ruby 样式。共有三个选项:
- 将整个 Jackson 引擎切换为使用替代样式。 (这不是个好主意,因为它容易引起碰撞。
- 告诉 Jackson 为特定的 Java classes 使用替代风格。 (我们会这样做的。)
- 用
@JsonProperty
对每个 属性 进行注释(有效,但需要付出很多额外的努力)。
首先为您的属性使用标准 Java 命名:
class Profile14 {
private String pplRow;
public String getPplRow() {
return this.pplRow;
}
public void setPplRow(String s) {
this.pplRow = s;
}
}
请注意,方法 的命名方式 是定义属性的方式(因为支持字段是私有的,技术上不必存在)。您现有的属性既不匹配名称(pl
而不是 ppl
),也没有正确的大写。
现在将此注释添加到您的 class:
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
这告诉 Jackson 使用 snake_case
命名所有属性。这应该足以让您的地图正常工作。
我在服务器端将 JSON 字符串 (inputJson) 传递到我的 java 代码 (PPProgramAddView)。
PPProgramAddView:
inputJson: [{"ppl_row":0,"ppl_time":"07:00","ppat_id":"Mw==","ppa_id":"MTI=","ppl_LeadAssist":"Lead"},{"ppl_row":1,"ppl_time":"07:10","ppat_id":"Mg==","ppa_id":"NA==","ppl_LeadAssist":"Assist"}]
当我尝试处理它时出现以下错误:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "ppl_row" (class client.Profile14), not marked as ignorable (5 known properties: "plTime", "plActivity", "plActivityType", "plRow", "plLeadAssist"])
at [Source: (String)"[{"ppl_row":0,"ppl_time":"07:00","ppat_id":"Mw==","ppa_id":"MTI=","ppl_LeadAssist":"Lead"},{"ppl_row":1,"ppl_time":"07:10","ppat_id":"Mg==","ppa_id":"NA==","ppl_LeadAssist":"Assist"}]"; line: 1, column: 14] (through reference chain: java.lang.Object[][0]->client.Profile14["ppl_row"])
at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61)
我进行了搜索,但在任何地方都找不到“plTime”、“plActivity”、“plActivityType”、“plRow”、“plLeadAssist”。
我的代码是:
//Look through the new program lines and add them.
try {
ObjectMapper mapper = new ObjectMapper();
Profile14[] profiles14 = mapper.readValue(inputJson, Profile14[].class);
for (final Profile14 programLine : profiles14) {
String ppl_row = programLine.getplRow();
String ppl_time = null;
if (programLine.getplTime().length() < 1){
ppl_time = "00:01";
}else{
ppl_time = programLine.getplTime();
}
String ppat_id_encoded = programLine.getplActivityType();
String ppa_id_encoded = programLine.getplActivity();
String ppl_LeadAssist = programLine.getplLeadAssist().substring(0, Math.min(programLine.getplLeadAssist().length(), 45));
byte[] valueDecoded3 = Base64.decodeBase64(ppat_id_encoded);//decoding part
String ppat_id = new String(valueDecoded3);
byte[] valueDecoded4 = Base64.decodeBase64(ppa_id_encoded);//decoding part
String ppa_id = new String(valueDecoded4);
System.out.println("ppID: " + ppID + " ppat_id: " + ppat_id + " ppa_id: " + ppa_id +
" ppl_row : " + ppl_row + " ppl_time: " + ppl_time + " ppl_LeadAssist: " + ppl_LeadAssist);
MySQLConnection.addPPProgramLine(ppID, ppat_id, ppa_id, ppl_row, ppl_time, ppl_LeadAssist);
}
} catch (Exception e) {
e.printStackTrace();
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Error.");
}
}
}
class Profile14 {
private String ppl_row;
private String ppl_time;
private String ppat_id;
private String ppa_id;
private String ppl_LeadAssist;
public String getplRow() {
return ppl_row;
}
public void setplRow(String ppl_row) {
this.ppl_row = ppl_row;
}
public String getplTime() {
return ppl_time;
}
public void setplTime(String ppl_time) {
this.ppl_time = ppl_time;
}
public String getplActivityType() {
return ppat_id;
}
public void setplActivityType (String ppat_id) {
this.ppat_id = ppat_id;
}
public String getplActivity() {
return ppa_id;
}
public void setplActivity(String ppa_id) {
this.ppa_id = ppa_id;
}
public String getplLeadAssist() {
return ppl_LeadAssist;
}
public void setplLeadAssist(String ppl_LeadAssist) {
this.ppl_LeadAssist = ppl_LeadAssist;
}
@Override
public String toString() {
return "Profile14 [ppl_row=" + ppl_row + ", ppl_time=" + ppl_time + ", ppat_id=" + ppat_id
+ ", ppa_id=" + ppa_id + ", ppl_LeadAssist=" + ppl_LeadAssist + "]";
}
}
您没有遵循 JavaBean 标准,如果没有明确的说明,Jackson 不知道如何映射您的 class。
Java 约定是将属性命名为 pplRow
,而您的 JSON 使用 ppl_row
的替代 Ruby 样式。共有三个选项:
- 将整个 Jackson 引擎切换为使用替代样式。 (这不是个好主意,因为它容易引起碰撞。
- 告诉 Jackson 为特定的 Java classes 使用替代风格。 (我们会这样做的。)
- 用
@JsonProperty
对每个 属性 进行注释(有效,但需要付出很多额外的努力)。
首先为您的属性使用标准 Java 命名:
class Profile14 {
private String pplRow;
public String getPplRow() {
return this.pplRow;
}
public void setPplRow(String s) {
this.pplRow = s;
}
}
请注意,方法 的命名方式 是定义属性的方式(因为支持字段是私有的,技术上不必存在)。您现有的属性既不匹配名称(pl
而不是 ppl
),也没有正确的大写。
现在将此注释添加到您的 class:
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
这告诉 Jackson 使用 snake_case
命名所有属性。这应该足以让您的地图正常工作。