如何使用Java处理JSON

问题描述

我将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_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不知道如何映射您的类。

Java惯例是命名诸如pplRow之类的属性,并且您的JSON使用ppl_row的替代Ruby样式。共有三个选项:

  • 切换整个J​​ackson引擎以使用其他样式。 (不是一个好主意,因为它容易引起碰撞。
  • 告诉Jackson为特定的Java类使用替代样式。 (我们将这样做。)
  • @JsonProperty注释每个属性(可以,但是需要很多额外的精力)。

首先为属性使用标准Java命名:

class Profile14 {
  private String pplRow;

  public String getPplRow() {
    return this.pplRow;
  }

  public void setPplRow(String s) {
    this.pplRow = s;
  }
}

请注意,方法的命名 是定义属性的内容(因为后备字段是私有的,从技术上讲不必存在)。您现有的属性都与名称(pl而不是ppl)不匹配,并且没有正确的大写字母。

现在将此注释添加到您的班级:

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

这告诉Jackson使用snake_case来命名所有属性。这应该足以使您的映射正常工作。