Справка по картированию JSON Twitter ответ Jaxb с Jettison - PullRequest
1 голос
/ 29 ноября 2010

Я немного новичок в использовании манипуляций с форматом JSON и не слишком экспериментировал с JAXB. Я пытаюсь создать небольшой клиент для запуска поиска в Twitter. Моя стартовая среда - JBoss RESTEasy (реализация JAX-RS), которая предоставляет элегантный способ использования сервисов Rest Services JSON путем сопоставления JSON с JAXB через инфраструктуру Jettison (она также работает другим способом, если вы хотите предоставить сервис REST и создать JSON из JAXB).

Итак, я запускаю простой запрос в Twitter:

http://search.twitter.com/search.json?q=java

И ответ приходит в следующем формате JSON

{
"results":
[
  {"from_user_id_str":"67875385",
  "profile_image_url":"http://a2.twimg.com/axt_normal.png",
  "created_at":"Sun, 28 Nov 2010 22:38:39 +0000",
  "from_user":"extant",
  "id_str":"9013327095136256",
  "metadata":{"result_type":"recent"},
  "to_user_id":null,
  "text": "New blog post: No fancy swap in java",
  "id":9013327095136256,
  "from_user_id":67875385,
  "geo":null,
  "iso_language_code":"en",
  "to_user_id_str":null,
  "source":"wordpress"
  }, 
  <more tweets...>
],
"max_id":9013327095136256,
"since_id":0,
"refresh_url":"?since_id=9013327095136256&q=java",
"next_page":"?page=2&max_id=9013327095136256&q=java",
"results_per_page":15,
"page":1,"completed_in":0.020154,
"since_id_str":"0",
"max_id_str":"9013327095136256",
"query":"java"
} 

Итак, я создал два класса для сопоставления этого ответа

@BadgerFish
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class SearchResults { 
 @XmlElement
 public List<Tweet> results;
 @XmlElement(name = "max_id")
 public long maxId;
 @XmlElement(name = "since_id")
 public long sinceId;
}

и

@BadgerFish
@XmlRootElement(name="tweet")
public class Tweet {

 @XmlElement(name = "id")
 public long id;

 @XmlElement(name = "text")
 public String text;

 @XmlElement(name = "created_at")
 public Date createdAt;

 @XmlElement(name = "from_user")
 public String fromUser;

 @XmlElement(name = "profile_image_url")
 public String profileImageUrl;

 @XmlElement(name = "to_user_id")
 public Long toUserId;

 @XmlElement(name = "from_user_id")
 public long fromUserId;

 @XmlElement(name = "language_code")
 public String languageCode;

 @XmlElement(name = "source")
 public String source;

}

Мой Twitter RESTEasy клиент представляет собой простой интерфейс

public interface TwitterResource {
 @Path("/search.json")
 @Consumes("application/*+json")
 @GET
 SearchResults search(@QueryParam("q")String query); 
}

Который используется со следующим кодом RESTEasy:

...
TwitterResource tr = ProxyFactory.create(TwitterResource.class, "http://search.twitter.com");
SearchResults sr = tr.search("java");
...

Этот код дает следующее исключение:

Exception in thread "main" org.jboss.resteasy.plugins.providers.jaxb.JAXBUnmarshalException: javax.xml.bind.JAXBException
 - with linked exception:
[org.codehaus.jettison.json.JSONException: JSONObject["results"] is not a JSONObject.]
 at org.jboss.resteasy.plugins.providers.jaxb.AbstractJAXBProvider.readFrom(AbstractJAXBProvider.java:86)

Я предполагаю, что это происходит из-за неправильного отображения JAXB в классе SearchResults, но не могу понять, как его исправить (и это сложно с переводом JSON в XML). Любая подсказка, чтобы исправить это было бы здорово.

Заранее спасибо

1 Ответ

3 голосов
/ 30 ноября 2010

Хорошо, не найдено решение с Jettison (я уверен, что это ошибка) и отображением JAXB для JSON. Но так как RESTEasy поддерживает также Jackson Framework, я переключился на Jackson, и теперь все в порядке.

На самом деле я нахожу более чистым, чтобы избежать перевода JSON в JAXB, который использовало мое первое решение.

Спасибо себе; -)

...