使用jackson无法将包含内部对象的JSON解析为Java对象

3
我正在使用Spring开发项目,并希望将以字符串格式传入控制器的JSON数据进行解析。为了展示问题,我编写了下面的小程序。
经过足够的搜索,但没有运气。希望在这个网站上得到答案。 问题:无法解析内部对象,即A3PatientRecordStatusBean。 程序输出:MedicPatientRecordDataStatusBean [a3PatientRecordStatusBean=null]
尝试执行JSON解析的主程序:
public static void main(String[] args) {
        String jsonString = "{\"a3PatientRecordStatusBean\":{\"patientRecordId\":\"1\",\"messageCode\":\"2000\"}}";
        ObjectMapper mapper = new ObjectMapper();
        try {
            MedicPatientRecordDataStatusBean medicPatientRecordDataStatusBean = mapper.readValue(jsonString, MedicPatientRecordDataStatusBean.class);
            System.out.println(medicPatientRecordDataStatusBean);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

外部类/对象:

@JsonAutoDetect
public class MedicPatientRecordDataStatusBean implements Serializable {
    private static final long serialVersionUID = -4917476398283528449L;

    private A3PatientRecordStatusBean a3PatientRecordStatusBean;

    /**
     * @return the a3PatientRecordStatusBean
     */
    public A3PatientRecordStatusBean getA3PatientRecordStatusBean() {
        return a3PatientRecordStatusBean;
    }

    /**
     * @param a3PatientRecordStatusBean
     *            the a3PatientRecordStatusBean to set
     */
    public void setA3PatientRecordStatusBean(
            A3PatientRecordStatusBean a3PatientRecordStatusBean) {
        a3PatientRecordStatusBean = a3PatientRecordStatusBean;
    }

    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "MedicPatientRecordDataStatusBean [a3PatientRecordStatusBean="
                + a3PatientRecordStatusBean + "]";
    }

}

内部对象类:

@JsonAutoDetect
public class A3PatientRecordStatusBean implements Serializable {
    private static final long serialVersionUID = -4585669896170562832L;
    private String patientRecordId = "";
    private String messageCode = "";

    /**
     * @return the patientRecordId
     */
    public String getPatientRecordId() {
        return patientRecordId;
    }

    /**
     * @param patientRecordId
     *            the patientRecordId to set
     */
    public void setPatientRecordId(String patientRecordId) {
        this.patientRecordId = patientRecordId;
    }

    /**
     * @return the messageCode
     */
    public String getMessageCode() {
        return messageCode;
    }

    /**
     * @param messageCode
     *            the messageCode to set
     */
    public void setMessageCode(String messageCode) {
        this.messageCode = messageCode;
    }

    @Override
    public String toString() {
        return "A3PatientRecordStatusBean [patientRecordId=" + patientRecordId
                + ", messageCode=" + messageCode + "]";
    }

}

3
问题是什么,提出的问题是什么? - Svetlin Zarev
无法使用jackson解析下面提到的JSON字符串。String jsonString = "{"a3PatientRecordStatusBean":{"patientRecordId":"1","messageCode":"2000"}}";当我运行程序时,我得到以下输出: MedicPatientRecordDataStatusBean [a3PatientRecordStatusBean=null]理想情况下,程序应该解析JSON字符串并使用解析后的值加载Java对象。PS:我能够解析外部对象,但无法解析内部对象/数据,即{"patientRecordId":"1","messageCode":"2000"}。 - user3122759
@SvetlinZarev 你需要阅读完整的描述才能理解问题。给负面评价是不正确的。 另外,我不是该领域的学习者。我在这个领域有丰富的经验,但某些愚蠢的问题却无法解决。PS. 我在其他项目中使用了Jackson。 - user3122759
2个回答

3
经过许多小时的努力,我已经能够使用Jackson解析JSON字符串并加载Java对象。下面是修改后的可行代码。 总结一下,我做了以下几个步骤。
  1. 从bean类中删除@JsonAutoDetect、Serializable、serialVersionUID等。
  2. 创建简单的bean类,只包含实例变量和set/get方法。
  3. 编写覆盖的toString()方法。
下面是几个没有任何错误的类。类中的一些实例变量可能略有不同,但应该能传达信息。 MedicPatientRecordDataStatusBean类
public class MedicPatientRecordDataStatusBean {
private int messageCode;
private A3PatientRecordStatusBean a3PatientRecordStatusBean;

public int getMessageCode() {
    return messageCode;
}
public void setMessageCode(int messageCode) {
    this.messageCode = messageCode;
}
public A3PatientRecordStatusBean getA3PatientRecordStatusBean() {
    return a3PatientRecordStatusBean;
}
public void setA3PatientRecordStatusBean(
        A3PatientRecordStatusBean a3PatientRecordStatusBean) {
    this.a3PatientRecordStatusBean = a3PatientRecordStatusBean;
}
@Override
public String toString() {
    return "MedicPatientRecordDataStatusBean [messageCode=" + messageCode
            + ", a3PatientRecordStatusBean=" + a3PatientRecordStatusBean"]";
}

}

A3PatientRecordStatusBean

public class A3PatientRecordStatusBean {
private int patientRecordId;
private int patientProfile;
private int messageCode;

public int getPatientRecordId() {
    return patientRecordId;
}
public void setPatientRecordId(int patientRecordId) {
    this.patientRecordId = patientRecordId;
}
public int getPatientProfile() {
    return patientProfile;
}
public void setPatientProfile(int patientProfile) {
    this.patientProfile = patientProfile;
}
public int getMessageCode() {
    return messageCode;
}
public void setMessageCode(int messageCode) {
    this.messageCode = messageCode;
}

@Override
public String toString() {
    return "A3PatientRecordStatusBean [patientRecordId=" + patientRecordId
            + ", patientProfile=" + patientProfile + ", messageCode="
            + messageCode + "]";
}

希望这篇文章对其他开发者有所帮助,不需要再花时间解析JSON字符串了。最后感谢Stack Overflow以及所有提供帮助和建议的人。


0

我认为在这种情况下,您需要使用@JsonUnwrapped注释MedicPatientRecordDataStatusBean中的字段'private A3PatientRecordStatusBean a3PatientRecordStatusBean;'。


正如您建议的那样,我尝试了注释但没有成功。仍然无法解析内部数据并加载Java对象。 @JsonUnwrapped private A3PatientRecordStatusBean a3PatientRecordStatusBean; - user3122759
由于该字段是私有的,请在获取字段时尝试它。 - iouardi
iouardi,感谢您的回复,但@JsonUnwrapped并没有解决这个问题。 - user3122759

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接