5

以下の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\"}]";

ジャクソンパーサーを使用してクラスにマップしています:

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 はこの操作をサポートできますか。

ありがとう

4

3 に答える 3

3

これはあまりしないでください。Gsonを使用すると非常に簡単です

次のような単一セットレコードのクラスを作成します

class Movie{
    private String movieName;
    private String Leadactor;
    private String leadActress;

    //put getter and setter for your fields
}

in main file
Type type = new TypeToken<List<Movie>>(){}.getType();
List<Movie> data = new Gson().fromJson(json_string,type);
于 2013-06-04T19:09:15.723 に答える
0

次のようにフィールドを宣言します@JsonProperty String[] data

と使用

 new ObjectMapper()
      .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
      .readValue(json, YOUT_TYPE.class)

したがって、このオプションは Jackson を "foo":"bar" と "foo": ["a", "b", "c"] の両方に分割します。

あなたがする必要があるのは、文字列配列を右の行区切りで文字列にマージすることだけです。私はグアバ経由でそれを行いますdata == null ? null : Jointer.on("\n").join(data)

于 2014-06-13T10:36:35.760 に答える