Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson解析器json setter将值作为字符串数组_Java_Json_Jackson_Gson - Fatal编程技术网

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

Java Jackson解析器json setter将值作为字符串数组,java,json,jackson,gson,Java,Json,Jackson,Gson,我有以下建议: "[{\"movieName\":\"A\",\"Leadactor\":\"\",\"leadActress\":\"\",\"movieTitle\":\"\",\"hero\":\"\",\"heroine\":\"\",\"source\":\"IMDB\"}," + "{\"movieName\":\"\",\"Leadactor\":\"\",\"leadActress\":\"\",\"movieTitle\":\"B\",\"hero\":\"B1

我有以下建议:

    "[{\"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\"}]";
我正在使用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;
    }
}

在我真正的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;
        }
}
  }
上面的代码在jsonSetter上给了我错误:

 Type mismatch: cannot convert from String[] to String.
编辑

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


谢谢

不要做这么多。使用Gson非常简单

为单集记录创建类 像

类电影{
私有字符串movieName;
私人字符串主角;
私人弦乐女主角;
//为您的字段放置getter和setter
}
在主文件中
Type Type=new-TypeToken(){}.getType();
List data=new Gson().fromJson(json_字符串,类型);

您可以使用
@JsonAnySetter
,您可以在第页找到它的含义

我创建了与您的示例相关的简单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;
    }
}
因此,我可以看到:

[A, B, C, D, E]

您可以像
@JsonProperty String[]data

和使用

 new ObjectMapper()
      .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
      .readValue(json, YOUT_TYPE.class)
因此,此选项使Jackson同时成为“foo”:“bar”和“foo”:[“a”、“b”、“c”]


您所需要做的就是使用右行分隔符将字符串数组合并回字符串中。我是通过Guava
data==null来实现的?null:joint.on(“\n”).join(数据)

我知道gson。问题在于规范化。我希望电影也映射到电影名称;请不要要求人们投票/接受你的答案。谢谢你的问题不是很清楚。。。是否希望对象列表
Movie
具有属性
name
,该属性包含
“movieName”
“movieTitle”
的值?如果说,
“movieName”
有一个值,
“movieTitle”
将始终是emtpty?您是否尝试过向setName添加多个注释,一个用于movieName,一个用于movieTitle?否则,下面使用@JsonAnySetter的解决方案将起作用。@MikO yes我想要一个带有属性名的对象列表,该属性名包含电影名或电影标题的值。是,如果电影名称有一个vlaue,则电影标题为空。
[A, B, C, D, E]
 new ObjectMapper()
      .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
      .readValue(json, YOUT_TYPE.class)