read - récupérer données json java




Jackson parser json setter pour prendre de la valeur en tant que tableau de chaînes (2)

Vous pouvez utiliser @JsonAnySetter , ce que vous pouvez trouver sur la page Annotations de Jackson Core (Data-Binding) .

J'ai créé un bean simple qui est lié à votre exemple:

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;
    }
}

Maintenant, quand je désérialise votre JSON de cette manière:

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

Comme résultat, je peux voir:

[A, B, C, D, E]

J'ai ci-dessous 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\"}]";

J'utilise jackson parser pour le mapper à une classe:

Je veux que movieName et movieTitle soient mappés dans la propriété Name de la classe java. J'ai donc écrit la classe ci-dessous:

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;
    }

}

Dans mon vrai json il y a tellement de domaines comme movieName, movieTitle que je veux normaliser en un nom commun.

Y at-il une syntaxe simple comme ci-dessous qui peut réduire la duplication de code:

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;
        }
}
  }

Le code ci-dessus m'a donné une erreur sur jsonSetter:

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

MODIFIER

Si Jackson ne le supporte pas, GSON peut-il supporter cette opération?

Merci


Ne fais pas ça beaucoup. c'est très simple avec Gson

créer une classe pour votre enregistrement de jeu unique comme

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);




gson