jsonvalue example deserialize annotation java json jackson deserialization

example - objectmapper java



Deserializar JSON en un objeto existente(Java) (7)

FlexJson también puede ayudarte a hacer lo mismo.

Aquí hay un ejemplo copiado de FlexJson Doc.

La función deserializeInto lleva su cadena y referencia al objeto existente.

Person charlie = new Person("Charlie", "Hubbard", cal.getTime(), home, work ); Person charlieClone = new Person( "Chauncy", "Beauregard", null, null, null ); Phone fakePhone = new Phone( PhoneNumberType.MOBILE, "303 555 1234"); charlieClone.getPhones().add( fakePhone ); String json = new JSONSerializer().include("hobbies").exclude("firstname", "lastname").serialize( charlie ); Person p = new JSONDeserializer<Person>().deserializeInto(json, charlieClone);

Tenga en cuenta que la referencia devuelta en p es la misma que charlieClone solo con valores actualizados.

Me gustaría saber cómo se puede obtener la biblioteca Jackson JSON para deserializar JSON en un objeto existente. He tratado de encontrar cómo hacer esto; pero parece que solo puede tomar una Clase y crear una instancia de ella misma.

O si no es posible, me gustaría saber si alguna biblioteca de deserialización Java JSON puede hacerlo.

Esto parece ser una pregunta correspondiente para C #: Datos de superposición de la cadena JSON a la instancia de objeto existente . Parece que JSON.NET tiene un objeto PopulateObject (cadena, objeto).


Si está utilizando Spring Framework, puede usar la biblioteca BeanUtils para esta tarea. Primero deserialice su json String normalmente y luego use BeanUtils para establecer este objeto dentro de un objeto principal. También espera que el nombre de la variable del objeto se establezca dentro del objeto principal. Aquí está el fragmento de código:

childObject = gson.fromJson("your json string",class.forName(argType)) BeanUtils.setProperty(mainObject, "childObjectName", childObject);


Si puede usar otra biblioteca en lugar de Jackson, puede probar Genson http://owlike.github.io/genson/ . Además de algunas otras características interesantes (como deserializar utilizando un constructor no vacío sin ninguna anotación, deserializar a tipos polimórficos, etc.), admite la deserialización de JavaBean en una instancia existente. Aquí hay un ejemplo:

BeanDescriptorProvider provider = new Genson().getBeanDescriptorFactory(); BeanDescriptor<MyClass> descriptor = provider.provide(MyClass.class, genson); ObjectReader reader = new JsonReader(jsonString); MyClass existingObject = descriptor.deserialize(existingObject, reader, new Context(genson));

Si tiene alguna pregunta, no dude en utilizar su lista de correo http://groups.google.com/group/genson .


Siempre se podría cargar en un objeto ficticio y usar la reflexión para transferir los datos. Si tu corazón está puesto en solo usar Gson

ejemplo. Suponiendo que este código está en el objeto en el que desea copiar datos

public void loadObject(){ Gson gson = new Gson(); //make temp object YourObject tempStorage = (YourObject) gson.fromJson(new FileReader(theJsonFile), YourObject.class); //get the fields for that class ArrayList<Field> tempFields = new ArrayList<Field>(); ArrayList<Field> ourFields = new ArrayList<Field>(); getAllFields(tempFields, tempStorage.getClass()); getAllFields(thisObjectsFields, this.getClass()); for(Field f1 : tempFields){ for(Field f2 : thisObjectsFields){ //find matching fields if(f1.getName().equals(f2.getName()) && f1.getType().equals(f2.getType())){ //transient and statics dont get serialized and deserialized. if(!Modifier.isTransient(f1.getModifiers())&&!Modifier.isStatic(f1.getModifiers())){ //make sure its a loadable thing f2.set(this, f1.get(tempStorage)); } } } }

}

public static List<Field> getAllFields(List<Field> fields, Class<?> type) { for (Field field : type.getDeclaredFields()) { fields.add(field); } if (type.getSuperclass() != null) { fields = getAllFields(fields, type.getSuperclass()); } return fields; }


Una solución es analizar un nuevo gráfico / árbol de objetos y luego unificar-copiar en el gráfico / árbol de objetos existente. Pero, por supuesto, es menos eficiente y más trabajo, especialmente si los tipos concretos difieren debido a la menor disponibilidad de información de tipo. (Entonces realmente no es una respuesta. Espero que haya una mejor respuesta, solo quiero evitar que otros respondan de esta manera).


Usé el DataBinder de Jackson + Spring para lograr algo como esto. Este código maneja matrices pero no objetos anidados.

private void bindJSONToObject(Object obj, String json) throws IOException, JsonProcessingException { MutablePropertyValues mpv = new MutablePropertyValues(); JsonNode rootNode = new ObjectMapper().readTree(json); for (Iterator<Entry<String, JsonNode>> iter = rootNode.getFields(); iter.hasNext(); ) { Entry<String, JsonNode> entry = iter.next(); String name = entry.getKey(); JsonNode node = entry.getValue(); if (node.isArray()) { List<String> values = new ArrayList<String>(); for (JsonNode elem : node) { values.add(elem.getTextValue()); } mpv.addPropertyValue(name, values); if (logger.isDebugEnabled()) { logger.debug(name + "=" + ArrayUtils.toString(values)); } } else { mpv.addPropertyValue(name, node.getTextValue()); if (logger.isDebugEnabled()) { logger.debug(name + "=" + node.getTextValue()); } } } DataBinder dataBinder = new DataBinder(obj); dataBinder.bind(mpv); }