如何将字符串 json 映射到 POJO class?

How to map string json to POJO class?

我有一个bodyreturn这个:

{
  "a_name": "Max",
  "a_surname": "Miles",
  "a_details":  {
    "DETAILS": [
      {
        "DATE": "1996-12-31T00:00:00.000",
        "AGE": "24",
        "ACCNUM": "17",
        "FORSPEC": "Smth written here",
        "EXIT": "1"
      }, ] //list of json
  }

现在我可以 return 姓名和姓氏,但在映射 json 字段时遇到问题。这是我的 POJO 的样子:

class Value {
    String name;
    String surname;
    List<AccountDetail> detail;

    //setter getter
}

class AccountDetail {
    LocalDateTime DATE;
    Number AGE;
    Number ACCNUM;
    String FORSPEC;
    Number EXIT;
    
    //setter getter
}

这是该字段的映射器:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(
        DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
List<AccountDetails> details = mapper.readValue(stringJson, Value.class);

但是我遇到了无法识别的字段等错误。什么是问题?也许我应该以其他方式实现我的 POJO class 或者我的映射器有问题?

你可以使用 Gson 库

   public class JsonFormater {

    public static void main(String[] args) {
        Gson gs = new Gson();
        // TODO Auto-generated method stub
        String jsonstring = "{\n" + "   \"a_name\":\"Max\",\n" + "   \"a_surname\":\"Miles\",\n"
                + "   \"a_details\":{\n" + "      \"DETAILS\":[\n" + "         {\n"
                + "            \"DATE\":\"1996-12-31T00:00:00.000\",\n" + "            \"AGE\":\"24\",\n"
                + "            \"ACCNUM\":\"17\",\n" + "            \"FORSPEC\":\"Smth written here\",\n"
                + "            \"EXIT\":\"1\"\n" + "         }\n" + "      ]\n" + "   }\n" + "}";

        Information infomation = gs.fromJson(jsonstring, Information.class);

        System.out.println(infomation.getaName());
        System.out.println(infomation.getaSurname());
        if (infomation.getaDetails() != null) {
            TestData testdata = infomation.getaDetails();
            for (Detail detail : testdata.getDetails()) {
                System.out.println(detail.getAge());
            }
        }

    }

}

public class Detail {
    @SerializedName("DATE")
    @Expose
    private String date;
    @SerializedName("AGE")
    @Expose
    private String age;
    @SerializedName("ACCNUM")
    @Expose
    private String accnum;
    @SerializedName("FORSPEC")
    @Expose
    private String forspec;
    @SerializedName("EXIT")
    @Expose
    private String exit;

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getAccnum() {
        return accnum;
    }

    public void setAccnum(String accnum) {
        this.accnum = accnum;
    }

    public String getForspec() {
        return forspec;
    }

    public void setForspec(String forspec) {
        this.forspec = forspec;
    }

    public String getExit() {
        return exit;
    }

    public void setExit(String exit) {
        this.exit = exit;
    }

}

   public class TestData {

    @SerializedName("DETAILS")
    @Expose
    private List<Detail> details = null;

    public List<Detail> getDetails() {
        return details;
    }

    public void setDetails(List<Detail> details) {
        this.details = details;
    }

}

public class Information {
@SerializedName("a_name")
@Expose
private String aName;
@SerializedName("a_surname")
@Expose
private String aSurname;
@SerializedName("a_details")
@Expose
private TestData aDetails;

public String getaName() {
    return aName;
}

public void setaName(String aName) {
    this.aName = aName;
}

public String getaSurname() {
    return aSurname;
}

public void setaSurname(String aSurname) {
    this.aSurname = aSurname;
}

public TestData getaDetails() {
    return aDetails;
}

public void setaDetails(TestData aDetails) {
    this.aDetails = aDetails;
}

}

正确格式化您的 json 并像这样尝试

您可以使用 Jackson 库进行 Json 阅读,并为不同的名称使用注释 @JsonProperty("a_name")

我在你的代码中发现了几个问题:

这是不正确的 - List<AccountDetail> detail

您应该声明一个字段 DETAILS,作为一个新的 class,里面应该是列表。

您定义的 class 中还缺少“EXIT”字段。

完整的工作示例。

public String test() throws JsonProcessingException
{
    String json = "your json here....";

    ObjectMapper mapper = new ObjectMapper();

    mapper.setDefaultPrettyPrinter(new PrettyPrinter());
    mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
    mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
    mapper.enableDefaultTyping();

    mapper.registerModule(new ParameterNamesModule())
    .registerModule(new Jdk8Module())
    .registerModule(new JavaTimeModule());

    mapper.readValue(json, Value.class);

    return "success";
}

public static class PrettyPrinter extends DefaultPrettyPrinter
{
    private static final long serialVersionUID = 1L;

    public PrettyPrinter()
    {
        indentArraysWith(DefaultIndenter.SYSTEM_LINEFEED_INSTANCE);
    }
}

private static class Value
{
    @JsonProperty("a_name")
    String name;
    @JsonProperty("a_surname")
    String surname;
    @JsonProperty("a_details")
    Details details;

    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public String getSurname()
    {
        return surname;
    }
    public void setSurname(String surname)
    {
        this.surname = surname;
    }

    public Details getDetails()
    {
        return details;
    }

    public void setDetails(Details details)
    {
        this.details = details;
    }
}

private static class Details
{
    @JsonProperty("DETAILS")
    AccountDetail []detail;

    public AccountDetail[] getDetail()
    {
        return detail;
    }

    public void setDetail(AccountDetail[] detail)
    {
        this.detail = detail;
    }
}

private static class AccountDetail
{
    LocalDateTime DATE;
    Number AGE;
    Number ACCNUM;
    String FORSPEC;
    Number EXIT;

    public LocalDateTime getDATE()
    {
        return DATE;
    }

    public void setDATE(LocalDateTime DATE)
    {
        this.DATE = DATE;
    }

    public Number getAGE()
    {
        return AGE;
    }

    public void setAGE(Number AGE)
    {
        this.AGE = AGE;
    }

    public Number getACCNUM()
    {
        return ACCNUM;
    }

    public void setACCNUM(Number ACCNUM)
    {
        this.ACCNUM = ACCNUM;
    }

    public String getFORSPEC()
    {
        return FORSPEC;
    }

    public void setFORSPEC(String FORSPEC)
    {
        this.FORSPEC = FORSPEC;
    }

    public Number getEXIT()
    {
        return EXIT;
    }

    public void setEXIT(Number EXIT)
    {
        this.EXIT = EXIT;
    }
}