JAXB oder JAX-RS ist die Verpackung zahlen in meiner JSON-Antworten mit Zitaten, um Sie in strings. Warum ist dies das Standardverhalten ist, und wie man es beheben?
Derzeit arbeite ich an einer RESTful API. Ich habe eine Klasse Mitarbeiter und eine EmployeeResource Klasse. Ich habe auch eine benutzerdefinierte DateAdapter, ändert sich mein Datum Eigenschaften zu Lang Zeitstempel. Allerdings hat mein JSON-Antworten zeigen, sind die Zeitstempel als String (eingewickelt in Anführungszeichen) eher als zahlen (ohne Anführungszeichen) ein. Hier ist eine abgekürzte version von meinem code und erfasst JSON-Antwort...
Benutzerdefinierte DateAdapter
public class DateAdapter extends XmlAdapter<Long, Date> {
@Override
public Date unmarshal(Long v) throws Exception {
return new Date(Long.valueOf(v));
}
@Override
public Long marshal(Date v) throws Exception {
return v.getTime();
}
}
Entity-Klasse
@Entity
@javax.xml.bind.annotation.XmlRootElement
@XmlType(propOrder={"createdOn","empId"})
public class Employee implements Serializable {
private Date createdOn;
private Integer empId;
@Column(nullable=false)
@Temporal(TemporalType.TIMESTAMP)
@XmlJavaTypeAdapter(DateAdapter.class)
public Date getCreatedOn() {
return createdOn;
}
public void setCreatedOn(Date createdOn) {
this.createdOn = createdOn;
}
@Id
@XmlID
public Integer getEmpId() {
return empId;
}
public void setEmpId(Integer empId) {
this.empId = empId;
}
}
EmployeeResource
@Path("/Employees")
@javax.xml.bind.annotation.XmlRootElement
@XmlType(propOrder={"hateoas","employees"})
public class EmployeeResource {
List<Employee> employees;
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
@GET
@Path("/{id}")
@Produces("application/json")
public Response getEmployee(@Context UriInfo ui, @PathParam("id") Integer id) {
Session session = HibernateUtil.getSession();
session.beginTransaction();
Criteria criteria=session.createCriteria(Employee.class);
criteria.add(Restrictions.eq("empId", new Integer(10150)));
this.employees = criteria.list();
return Response.ok(this).build();
}
}
Aktuellen JSON-Antwort
{
"employees":{
"createdOn":"1330915130163",
"empId":"10150"
}
}
Erwarteten JSON-Antwort
{
"employees":{
"createdOn":1330915130163,
"empId":10150
}
}
Gehe ich davon aus, dass es einige Weg, um zu verhindern, dass JAXB oder JAX-RS wickelt alle zahlen in Anführungszeichen. Könnte jemand mich leiten, wo könnte ich dies konfigurieren?
Vielen Dank im Voraus!
EDIT #1 2012.03.07
Ok, also nach etwas mehr recherche, ich denke, mein problem ist mit der Standard-JSONConfiguration.Notation verwendet wird, ZUGEORDNET . Es sieht aus wie die NATÜRLICHE JSONConfiguration.Notation würde, mich das, was ich will. Aber ich habe nicht gefunden ein klares Beispiel dafür, wie man diese Anwendung breit. Ich gehe davon aus, ich würde geben Sie dies in meinem ApplicationConfig Klasse erweitert javax.ws.rs.core.- Anwendung .
EDIT #2 2012.03.10
Ok, also nach etwas mehr recherche entschied ich mich für die JSON-parser-Bibliothek, Jackson. Es scheint die komplette JSON-Lösung gibt, mit nur der Standard-Konfiguration. Standardmäßig Daten übersetzt werden, um Ihre entsprechenden Zeitstempel und serialisiert als zahlen (w/o quotes). Der einzige Nachteil ich habe, ist, dass Jackson derzeit keine Unterstützung für die JAXB-Annotationen, "@XmlID" und "@XmlIDREF". Da habe ich direkte self-references in meinem Datenmodell (nicht oben gezeigt wird), die ich erstellt habe, eine weitere Frage zu diskutieren. Wenn jemand interessiert ist klicken Sie hier, um zu Folgen, dass der thread...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinweis: ich bin der EclipseLink JAXB (MOXy) führen und ein Mitglied der JAXB 2 (JSR-222) expert group.
Die JAX-RS-Implementierung, die Sie verwenden möglicherweise die Verwendung eines JAXB (JSR-222) Umsetzung mit so etwas wieüber Bord werfen zu produzieren JSON. Jettison bietet die StAX-API für die Interaktion mit JSON, da die StAX-APIs müssen nicht jede Art von Eingabe von WRT-text, alle die einfach die Werte als strings behandelt:
Um das Verhalten, die Sie suchen, können Sie eine andere verbindliche Lösung. Wir werden hinzufügen, dass diese Unterstützung in den MOXy-Komponente für EclipseLink 2.4:
Konfigurieren MOXy als Ihre JSON-binding-Anbieter in einer JAX-RS-Umgebung, die Sie erstellen könnte ein
MessageBodyReader
/MessageBodyWriter
wie das aussieht:Weitere Informationen