stddeserializer jsondeserialize deserializer deserialize custom java json jackson gson

java - jsondeserialize - Jackson parser json setter para tomar valor como matriz de cadenas



spring deserialize json (3)

Tengo debajo 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/"}]";

Estoy usando el analizador de Jackson para asignarlo a una clase:

Quiero que movieName y movieTitle se asignen a la propiedad Name en la clase java. Entonces escribí la siguiente clase:

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

}

En mi json real hay tantos campos como movieName, movieTitle que quiero normalizar en un nombre común.

¿Hay alguna sintaxis simple como la de abajo que pueda reducir la duplicación del código?

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

El código anterior me dio error en jsonSetter:

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

EDITAR

Si Jackson no lo admite, GSON puede respaldar esta operación.

Gracias


Puedes usar @JsonAnySetter , lo que significa que puedes encontrar en la página de anotaciones de Jackson Core (Data-Binding) .

Creé bean simple que está relacionado con tu ejemplo:

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

Ahora cuando deserializo tu JSON de esta manera:

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

Como resultado, puedo ver:

[A, B, C, D, E]


No hagas esto mucho. es muy simple con Gson

crear clase para su registro único conjunto como

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


@JsonProperty String[] data el campo como @JsonProperty String[] data

y use

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

Entonces esta opción hace que Jackson se aparte de "foo": "bar" y "foo": ["a", "b", "c"].

Todo lo que necesita hacer es fusionar la matriz de cadenas de nuevo en la cadena con los separadores de línea derecha. Lo hago a través de data == null ? null : Jointer.on("/n").join(data) Guava data == null ? null : Jointer.on("/n").join(data) data == null ? null : Jointer.on("/n").join(data)