2010-11-29 39 views
1

我有点新使用JSON格式操作,并且在JAXB中也没有很好的实验。 我试图做的是建立一个小型客户端在Twitter上启动搜索。我的起始框架是JBoss RESTEasy(JAX-RS实现),它通过将JSON映射到JAXB并通过Jettison框架提供了一种优雅的方式来使用Rest服务JSON服务(如果您想提供REST服务并从中生成JSON, JAXB)。帮助映射JSON Twitter与Jetxison的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; 
} 

and

@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) 

我假设它来自SearchResults类上错误的JAXB映射,但无法确定如何更正等它(它与JSON翻译到XML复杂)。任何改正它的线索都会很棒。

在此先感谢

+0

下面是如何可以用的EclipseLink JAXB(莫西)来完成一个完整的例子:http://blog.bdoughan.com/2011/08/json-binding-with- eclipselink-moxy.html – 2012-06-29 20:03:08

回答

3

好,没有与抛弃发现溶液(我相信这是一个bug)的JSON和JAXB映射。但由于RESTEasy也支持Jackson Framework,我转而使用Jackson,现在一切都好了。

事实上,我发现更多的干净,以避免这个JSONB到我的第一个解决方案使用的JAXB翻译。

感谢自己;-)

+0

是的,这是一个相当普遍的做JSON的“生命周期”--Jettison是一个旧的库,当它有意义(在某种程度上)通过XML API来处理JSON处理时编写。但自那以后发生了很多事情;唉,考虑到这段历史,大多数教程都以抛弃(或xstream +抛弃)方法开始,然后才呈现杰克逊的方法。 – StaxMan 2011-01-21 05:01:18