问题
I have a Java class annotated with @XmlRootElement
. This Java class has a long property (private long id
) that I want to return to a JavaScript-client.
I create the JSON as follows:
MyEntity myInstance = new MyEntity("Benny Neugebauer", 2517564202727464120);
StringWriter writer = new StringWriter();
JSONConfiguration config = JSONConfiguration.natural().build();
Class[] types = {MyEntity.class};
JSONJAXBContext context = new JSONJAXBContext(config, types);
JSONMarshaller marshaller = context.createJSONMarshaller();
marshaller.marshallToJSON(myInstance, writer);
json = writer.toString();
System.out.println(writer.toString());
This will be generated:
{"name":"Benny Neugebauer","id":2517564202727464120}
But the problem is that the long value is too large for the JavaScript client. Therefore, I would like to return this value as a string (without making the long a string in Java).
Is there an annotation (or something similar) that can generate the following?
{"name":"Benny Neugebauer","id":"2517564202727464120"}
回答1:
Note: I'm the EclipseLink JAXB (MOXy) lead and a member of the JAXB (JSR-222) expert group.
Below is how you could accomplish this use case with MOXy as your JSON provider.
MyEntity
You would annotate your long
property with @XmlSchemaType(name="string")
to indicate that it should be marshalled as a String
.
package forum11737597;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class MyEntity {
private String name;
private long id;
public MyEntity() {
}
public MyEntity(String name, long id) {
setName(name);
setId(id);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlSchemaType(name="string")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
}
jaxb.properties
To configure MOXy as your JAXB provider you need to include a file called jaxb.properties
in the same package as your domain model (see: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html).
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Demo
I have modified your sample code to show what it would look like if you used MOXy.
package forum11737597;
import java.io.StringWriter;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
public class Demo {
public static void main(String[] args) throws Exception {
MyEntity myInstance = new MyEntity("Benny Neugebauer", 2517564202727464120L);
StringWriter writer = new StringWriter();
Map<String, Object> config = new HashMap<String, Object>(2);
config.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
config.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
Class[] types = {MyEntity.class};
JAXBContext context = JAXBContext.newInstance(types, config);
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(myInstance, writer);
System.out.println(writer.toString());
}
}
Output
Below is the output from running the demo code:
{"id":"2517564202727464120","name":"Benny Neugebauer"}
For More Information
- http://blog.bdoughan.com/2011/08/json-binding-with-eclipselink-moxy.html
来源:https://stackoverflow.com/questions/11737597/how-to-return-a-long-property-as-json-string-value-with-jaxb