"Содержание не разрешено в прологе" при демонтаже Json Object

Я пытаюсь демонтировать объект Json, который я получаю из ответа Restful Service. Но это исключение при выполнении демаршаллинга?

MyClass.java

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class MyClass
{
  @XmlElement(name="id")
  private String id;

  @XmlElement(name="f-name")
  private String fname;


  @XmlElement(name="l-name")
  private String lname;

 // getters and setters for these

}

немаршальный метод

JAXBContext context = JAXBContext.newInstance(MyClass.class);
Unmarshaller unMarshaller = context.createUnmarshaller();  
URL url = new URL("http://localhost:8080/service-location");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Accept",  "application/json");
connection.connect();
MyClass myclass=(MyClass)unMarshaller.unmarshal(connection.getInputStream());

И когда я попытался использовать какой-нибудь клиент браузера, я получаю правильный ответ, как показано ниже

[
    {
        "fname": "JOHN",
        "lname": "Doe",
        "id": "abc123"          
    }
]

Но я пытаюсь сделать Unmarshall в моем коде клиента SAXParserException

Caused by: org.xml.sax.SAXParseException;  lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.

Я не уверен, что я делаю неправильно. Это способ сделать unmarshall объект JSON или есть другой способ сделать это?

ОБНОВЛЕНИЕ: РЕШЕНИЕ

Я исправил это, реализовав Jackson's ObjectMapper а не обычный UnMarshaller из JAXB, Вот мой код

ObjectMapper mapper = new ObjectMapper();
JavaType type = mapper.getTypeFactory().constructCollectionType(List.class, MYClass.class);
mapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
list = mapper.readValue(jsonString, type); // JsonString is my response converted into String of json data.

2 ответа

Решение

Ваниль JAXB

В настоящее время вы используете JAXB (Java Architecture для привязки XML) для обработки JSON. Он ожидает XML, поэтому вы получаете сообщение об ошибке.

EclipseLink JAXB (МОКСИ)

Если вы используете MOXy в качестве вашего JAXB-провайдера, есть свойство, которое вы можете установить, чтобы перевести его в режим JSON (см.: http://blog.bdoughan.com/2011/08/json-binding-with-eclipselink-moxy.html).

Джексон

Если вы намереваетесь использовать Джексона, вам нужно использовать их API времени выполнения.

Вам нужно настроить unmarshaller на JSON, иначе он будет по умолчанию использовать синтаксический анализ XML.

Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, "application/json");
unmarshaller.setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT, false);

Или используйте анализатор JSON, такой как Google GSON, чтобы выполнить демаршаллинг.

Другие вопросы по тегам