首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >帮助将JSON Twitter答案映射到Jaxb with Jettison

帮助将JSON Twitter答案映射到Jaxb with Jettison
EN

Stack Overflow用户
提问于 2010-11-29 18:28:10
回答 1查看 1.1K关注 0票数 1

我是一个使用JSON格式操作的新手,在JAXB中也不是很有经验。我想做的是创建一个小客户端来启动Twitter上的搜索。我的初始框架是JSON RESTEasy (JAX-RS实现),它提供了一种使用Rest服务JSON服务的优雅方式,通过丢弃框架将JSON映射到JAXB (如果您想提供REST服务并从JAXB生成JSON,它也可以以另一种方式工作)。

所以我向Twitter发起了一个简单的请求:

代码语言:javascript
复制
http://search.twitter.com/search.json?q=java

答案采用以下JSON格式

代码语言:javascript
复制
{
"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"
} 

所以我创建了两个类来映射这个答案

代码语言:javascript
复制
@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;
}

代码语言:javascript
复制
@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客户端是一个简单的界面。

代码语言:javascript
复制
public interface TwitterResource {
 @Path("/search.json")
 @Consumes("application/*+json")
 @GET
 SearchResults search(@QueryParam("q")String query); 
}

它是通过以下RESTEasy代码攻击的:

代码语言:javascript
复制
...
TwitterResource tr = ProxyFactory.create(TwitterResource.class, "http://search.twitter.com");
SearchResults sr = tr.search("java");
...

这段代码给出了以下异常:

代码语言:javascript
复制
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)

我假设它来自于错误的SearchResults类上的JAXB映射,但是不知道如何纠正它(而且从JSON到XML的转换很复杂)。任何能纠正它的线索都会很棒。

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-30 20:27:13

好吧,使用JSON的丢弃(我确信这是一个bug)和JAXB映射没有找到解决方案。但由于RESTEasy也支持杰克逊框架,所以我切换到了杰克逊,现在一切都好了。

事实上,为了避免这种JSON到JAXB的转换,我发现更简洁,我的第一个解决方案是使用。

感谢我自己;-)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4302827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档