2013-12-18 5 views
2

Я пытаюсь развязать Json Object, который я возвращаю из ответа Restful Service. Но это бросает исключение, делая unmarshalling?«Содержимое не допускается в прологе», а unmarshaling Json Object

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"   
    } 
] 

Но я пытаюсь сделать маршализацию в моем код клиента он бросает 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. 
+0

Вы указали свой JSON в массив, попробуйте без [и] –

+0

Я попытался с Валида JSON в качестве тестового примера. Он все еще бросает эту ошибку. – SRy

+0

@SotiriosDelimanolis .. Я тестирую спецификации, но ничего не нашел. Итак, с этой точки зрения все в порядке. – SRy

ответ

4

Vanilla JAXB

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

EclipseLink JAXB (Moxy)

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

Джексон

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

+0

Да. Я попробовал несколько примеров из вашего блога. Они работают очень хорошо. Но мы привязаны к джексону, поэтому не можем изменить версию сейчас.И более того, мы работаем на Jboss, так что не уверен, что что-то испортилось – SRy

+0

@SRy - Понятно. Джексон может интерпретировать некоторые метаданные JAXB, но у них есть свой собственный API времени выполнения: http://wiki.fasterxml.com/JacksonJAXBAnnotations –

+1

Спасибо, что направили меня в правильном направлении. Я исправил его родной objectMapper от Jackson. Кстати, отличная работа над реализацией EclipseLink Moxy JaxB. – SRy

2

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

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

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

Смежные вопросы