Nota: Soy el líder EclipseLink JAXB (MOXy) y miembro del grupo de expertos JAXB (JSR-222).
¿Cómo debo estructurar mi objeto Java?
A continuación se muestra el aspecto de su modelo de objeto. La vinculación JSON de MOXy aprovecha las anotaciones de JAXB para mapear el modelo de dominio a JSON, por lo que también las he incluido. Las implementaciones JAXB tienen reglas predeterminadas para correlacionar nombres de campos/propiedades, pero dado que su documento difiere del predeterminado, cada campo debe ser anotado.
MiResultado
package forum11001458;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="MyResult")
public class MyResult {
@XmlElement(name="AccountID")
private String accountID;
@XmlElement(name="User")
private User user;
@XmlElement(name="Result")
private Result result;
}
usuario
package forum11001458;
import javax.xml.bind.annotation.XmlElement;
public class User {
@XmlElement(name="Name")
private String name;
@XmlElement(name="Email")
private String email;
}
Resultado
package forum11001458;
import javax.xml.bind.annotation.XmlElement;
public class Result {
@XmlElement(name="Course")
private String course;
@XmlElement(name="Score")
private String score;
}
¿Qué biblioteca Json puedo usar para esto?
A continuación se muestra cómo se puede utilizar moxy hacer la unión JSON:
jaxb.propiedades
Para utilizar moxy como su proveedor de JAXB es necesario incluir un archivo llamado jaxb.properties
con la siguiente entrada en el mismo paquete que el modelo de dominio:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
demostración
Nota cómo El enlace JSON de MOXy no requiere ninguna dependencia de tiempo de compilación. Todas las API necesarias están disponibles en Java SE 6. Puede añadir las API de apoyo necesarios si está utilizando Java SE 5.
package forum11001458;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(MyResult.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.setProperty("eclipselink.media-type", "application/json");
File json = new File("src/forum11001458/input.json");
Object myResult = unmarshaller.unmarshal(json);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty("eclipselink.media-type", "application/json");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(myResult, System.out);
}
}
input.json/salida
{
"MyResult" : {
"AccountID" : "12345",
"User" : {
"Name" : "blah blah",
"Email" : "[email protected]"
},
"Result" : {
"Course" : "blah",
"Score" : "10.0"
}
}
}
Gracias por la respuesta. Si tuviera que diseñar esto en Jackson, ¿cómo debería ser mi objeto Java? – user238021