问题
I am having an JSON Response and what I need is to Map the corresponding JSON String to the particular Response class.Is there any tools or framework to do the same.
Response class is:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "0")
@XmlAccessorType(XmlAccessType.FIELD)
public class Student {
@XmlElement(name="0")
private String firstName;
@XmlElement(name="1")
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
Json Response String is {"0":{"0":"Rockey","1":"John"}}
I am using Apache CXF Framework with Jettison as the JSON Provider also uses JAXB to wire the data to low bandwidth clients.
Please make a note that I want to convert the number representations to corresponding fields.
回答1:
Note: I'm the EclipseLink JAXB (MOXy) lead and a member of the JAXB (JSR-222) expert group.
Below is how you an support your use case with your Student
class as annotated with EclipseLink JAXB (MOXy).
Demo
import java.io.StringReader;
import java.util.*;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, Object> properties = new HashMap<String, Object>(1);
properties.put("eclipselink.media-type", "application/json");
JAXBContext jc = JAXBContext.newInstance(new Class[] {Student.class}, properties);
Unmarshaller unmarshaller = jc.createUnmarshaller();
StringReader json = new StringReader("{\"0\":{\"0\":\"Rockey\",\"1\":\"John\"}}");
Student student = (Student) unmarshaller.unmarshal(json);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(student, System.out);
}
}
Output
{
"0" : {
"0" : "Rockey",
"1" : "John"
}
}
jaxb.properties
To use MOXy as your JAXB provider you need to include a file called jaxb.properties
in the same package as your domain model with the following entry:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
MOXy and JAX-RS
For JAX-RS applications you can leverage the MOXyJsonProvider
class to enable JSON-binding (see: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html).
- http://blog.bdoughan.com/2012/05/moxy-as-your-jax-rs-json-provider.html
回答2:
You can refer Google-GSON library - https://github.com/google/gson
You can also refer earlier stackoverflow answer - Convert a JSON string to object in Java ME?
回答3:
Jettison could do this. Found a sample code of unmarshalling JSON to object with JAXB here:
JAXBContext jc = JAXBContext.newInstance(Customer.class);
JSONObject obj = new JSONObject("{\"customer\":{\"id\":123,\"first-name\":\"Jane\",\"last-name\":\"Doe\",\"address\":{\"street\":\"123 A Street\"},\"phone-number\":[{\"@type\":\"work\",\"$\":\"555-1111\"},{\"@type\":\"cell\",\"$\":\"555-2222\"}]}}");
Configuration config = new Configuration();
MappedNamespaceConvention con = new MappedNamespaceConvention(config);
XMLStreamReader xmlStreamReader = new MappedXMLStreamReader(obj, con);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Customer customer = (Customer) unmarshaller.unmarshal(xmlStreamReader);
来源:https://stackoverflow.com/questions/13134563/json-string-to-object-mapping