Jackson解析器json setter将值作为字符串数组

jav*_*Man 5 java json jackson gson

我在json下面:

    "[{\"movieName\":\"A\",\"Leadactor\":\"\",\"leadActress\":\"\",\"movieTitle\":\"\",\"hero\":\"\",\"heroine\":\"\",\"source\":\"IMDB\"}," +
    "{\"movieName\":\"\",\"Leadactor\":\"\",\"leadActress\":\"\",\"movieTitle\":\"B\",\"hero\":\"B1\",\"heroine\":\"B2\",\"source\":\"Netflix\"}," +
    "{\"movieName\":\"C\",\"Leadactor\":\"C1\",\"leadActress\":\"C2\",\"movieTitle\":\"\",\"hero\":\"\",\"heroine\":\"\",\"source\":\"IMDB\"}," +
    "{\"movieName\":\"D\",\"Leadactor\":\"D1\",\"leadActress\":\"D2\",\"movieTitle\":\"\",\"hero\":\"\",\"heroine\":\"\",\"source\":\"IMDB\"}," +
    "{\"movieName\":\"\",\"Leadactor\":\"\",\"leadActress\":\"\",\"movieTitle\":\"E\",\"hero\":\"E1\",\"heroine\":\"E2\",\"source\":\"Netflix\"}]";
Run Code Online (Sandbox Code Playgroud)

我正在使用jackson解析器将其映射到一个类:

我希望movieName和movieTitle映射到java类中的Name属性.所以我写了下面的课程:

public static class MovieData {
    @JsonProperty("Name")
    private String name;

    @JsonSetter({"movieName"})
    private void setMovieName(final String name) {
            if((name != null) && (! name.equals(""))) {
                    setNameInternal(name);
            }
    }

    @JsonSetter("movieTitle")
    private void setMovieTitle(final String name) {
            if((name != null) && (! name.equals(""))) {
                    setNameInternal(name);
            }
    }

    private void setNameInternal(final String name) {
            this.name = name;
    }
Run Code Online (Sandbox Code Playgroud)

}

在我真正的json中有很多字段,比如movieName,movieTitle,我想将其标准化为一个通用名称.

有没有像下面这样可以减少代码重复的简单语法:

public static class MovieData {
    @JsonProperty("Name")
    private String name;

 @JsonSetter(value = { "movieName", "movieTitle" })
 private void setName(final String name) {
        if((name != null) && (! name.equals(""))) {
                this.name=name;
        }
}
  }
Run Code Online (Sandbox Code Playgroud)

上面的代码给了我jsonSetter的错误:

 Type mismatch: cannot convert from String[] to String.
Run Code Online (Sandbox Code Playgroud)

编辑

如果Jackson不支持,GSON可以支持此操作.

谢谢

Mic*_*ber 5

您可以使用@JsonAnySetter,您可以在Jackson Core(数据绑定)注释页面上找到它的含义.

我创建了与您的示例相关的简单bean:

class MovieData {

    private static List<String> NAME_PROPERTIES = Arrays.asList("movieName", "movieTitle");

    private String name;

    public void setName(String name) {
        this.name = name;
    }

    @JsonAnySetter
    private void parseUnknownProperties(String propertyName, String propertyValue) {
        if (NAME_PROPERTIES.contains(propertyName) && !propertyValue.isEmpty()) {
            this.name = propertyValue;
        }
    }

    @Override
    public String toString() {
        return name;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我以这种方式反序列化您的JSON时:

ObjectMapper objectMapper = new ObjectMapper();
System.out.println(Arrays.toString(objectMapper.readValue(json, MovieData[].class)));
Run Code Online (Sandbox Code Playgroud)

结果我可以看到:

[A, B, C, D, E]
Run Code Online (Sandbox Code Playgroud)