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可以支持此操作.
谢谢
您可以使用@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)
| 归档时间: |
|
| 查看次数: |
10693 次 |
| 最近记录: |