gpt4 book ai didi

java - 帮助使用 Jettison 将 JSON Twitter 答案映射到 Jaxb

转载 作者:行者123 更新时间:2023-11-29 06:17:59 25 4
gpt4 key购买 nike

我对使用 JSON 格式操作有点陌生,也没有在 JAXB 中进行过很多实验。我尝试做的是构建一个小客户端来在 Twitter 上启动搜索。我的起始框架是 JBoss RESTEasy(JAX-RS 实现),它通过 Jettison 框架将 JSON 映射到 JAXB 提供了一种优雅的方式来使用 Rest 服务 JSON 服务(如果您想提供 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)

我假设它来自 SearchResults 类上错误的 JAXB 映射,但无法确定如何更正它(并且将 JSON 转换为 XML 很复杂)。任何纠正它的线索都会很棒。

提前致谢

最佳答案

好的,没有找到 Jettison 的解决方案(我确信这是一个错误)和 JSON 的 JAXB 映射。但由于 RESTEasy 还支持 Jackson 框架,我切换到 Jackson,现在一切正常。

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

谢谢我自己 ;-)

关于java - 帮助使用 Jettison 将 JSON Twitter 答案映射到 Jaxb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4302827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com