如何将任意JSON转换为Java中的可用结构

我正在尝试使用gson将这个返回的JSON转换为某种数据结构,这样我就可以提取有用的数据。

例如:

http://search.twitter.com/search.json?q=test&rpp=1

返回:

{ "completed_in":0.028, "max_id":196386333906837504, "max_id_str":"196386333906837504", "next_page":"?page=2&max_id=196386333906837504&q=test&rpp=1", "page":1, "query":"test", "refresh_url":"?since_id=196386333906837504&q=test", "results":[ { "created_at":"Sat, 28 Apr 2012 23:52:05 +0000", "from_user":"della_ky", "from_user_id":525641596, "from_user_id_str":"525641596", "from_user_name":"kydella modeste", "geo":null, "id":196386333906837504, "id_str":"196386333906837504", "iso_language_code":"en", "metadata":{ "result_type":"recent" }, "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2159990525\/webcam-toy-photo3_20_2__normal.jpg", "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2159990525\/webcam-toy-photo3_20_2__normal.jpg", "source":"<a href="http:\/\/mobile.twitter.com" rel="nofollow">Mobile Web<\/a>", "text":"RT @Y__U__NOOO: #SongsIKnowOffByHeart ALL SONGS I LISTEN TO. BRAIN, YU NO REMEMBER TEST ANSWERS LIKE THAT?!?", "to_user":null, "to_user_id":null, "to_user_id_str":null, "to_user_name":null } ], "results_per_page":1, "since_id":0, "since_id_str":"0" } 

最后,我希望能够输出一个推文列表,其中包含发件人的姓名和推文的日期/时间。

我已经阅读了gson文档,但说实话 – 我有很多新概念。

我是否需要定义一个完全映射到JSON结构的类,然后填充该类的实例? 如果是这样,这似乎非常不灵活/费力。 理想情况下,我正在寻找能够以任何forms处理JSON的东西,并给我一个我可以自动使用的结构……

有人能给我一些指示吗? 对此更新 – 用最少的音节更详细和更准确的语言!

更新 – 感谢我已经对此做出的回应,我已经开始将一个课程组合在一起以捕获twitter JSON。 但是,由于JSON有一个嵌入的对象ArrayList,我有点挣扎……到目前为止,我有

 public class tweetData { private double completed_in; private long max_id; private long max_id_str; private String next_page; private int page; private String query; private String refresh_url; private List tweets = new ArrayList(); } 

 public class tweetDetails { private String created_at; private String from_user; private long from_user_id; private long from_user_id_str; private String from_user_name; private String geo; private long id; private long id_str; private String iso_language_code; // "metadata": // { // "result_type":"recent" // }, private String profile_image_url; private String profile_image_url_https; private String source; private String text; private String to_user; private String to_user_id; private String to_user_id_str; private String to_user_name; } 

我正在实例化

 URI uri = new URI("http", "search.twitter.com", "/search.json", "q="+ searchTerms + "&rrp=" + RRP, null); URL twitterSearch = uri.toURL(); URLConnection yc = twitterSearch.openConnection(); JsonReader reader = new JsonReader(new InputStreamReader(yc.getInputStream())); Gson gson = new Gson(); tweetData data = gson.fromJson(reader, tweetData.class); System.out.println(data); 

基本名称:正确填充值但ArrayList不正确填充。

 tweetData : 0.17196614959919140865196614959919140865?page=2&max_id=196614959919140865&q=test1test?since_id=196614959919140865&q=testSIZE 0[] 

所以,我还在苦苦挣扎 – 任何更多的提示非常感谢!

蒂姆,汤姆

我是否需要定义一个完全映射到JSON结构的类,然后填充该类的实例? 如果是这样,这似乎非常不灵活/费力。

是。 GSON是一个可用于将Java对象转换为JSON表示的库。 它还可用于将JSON字符串转换为等效的Java对象。 这非常强大,因为您可以从JSON表示自动实例化Java对象。 假设您的JSON没有更改其结构,您只需要定义一次适当的Java对象表示。

理想情况下,我正在寻找能够以任何forms处理JSON的东西,并给我一个我可以自动使用的结构……

但是,如果您不想进行自动序列化/反序列化,那么请尝试查看更简单的库,例如java.net/projects/jsonp 。

您只需查询键即可从中提取内容:

 final JSONObject json = new JSONObject(theJsonString); final String id = json.getString("max_id"); final JSONArray results = json.getJSONArray("results"); final String user = results.getJSONObject(2).getString("from_user"); 

Gson实际上为你做了所有序列化。 所以,是的,你必须自己编写课程。 对你而言,这种接缝是不灵活和费力的,但这只是因为该库不是为你所要求的而制作的(它不解析’任意’JSON)。

我建议至少考虑编写类并使用gson。 我之所以这么说是因为你的应用程序逻辑必须要求一种非常特定的格式,并且在Java类中写出这种格式会使事情变得更加整洁。 这是一个很好的指南 ,可以帮助您以这种方式开始。

如果你想简单地解码JSON而不将其序列化为Java类(恕我直言,使用’任意’JSON的唯一方法),你将需要使用另一个库。 试试这个 。 它允许您解码JSON,并通过从中获取值来使用它(如本问题中所述: 在Java ME中将JSON字符串转换为对象? )。

有一些工具可以将gson用于模式映射。 您提供了一些示例JSON响应,并为您创建了访问它们的java类。

http://www.jsonschema2pojo.org/

Gson是一个光滑的野兽! 或者至少在问这个问题以来已经过去了多年。

您可以将Object.class作为第二个参数传递给fromJson()方法,它会将您的Json解析为LinkedTreeMapArrayList的合理结构。

 Object result = (new Gson()).fromJson(jsonString, Object.class) 

更重要的是,通过将某个字段定义为Object,您可以真正进行部分解析并在对象结构的任何级别留下松散的末端!

然后Gson将Json解析为您的结构,Object类型的字段将包含LinkedTreeMapArrayList的上述结构。

例如,您可以定义一个类

 Person { String name; Object details; } 

(想象一下,你主要关心这个人的名字,但也可能想要某些地方的细节。例如,要记录它们。)

然后,您可以将以下Json作为第一个参数传递给fromJson(input,Person.class)方法

 { "name": "Carlsson", "details": { "address": "Stockholm", "phones": [ "work": "233-322-233-322", "home": "none" ] } } 

结果将使用“Carlsson”字符串填充名称字段, 详细信息字段将包含带有“地址”“电话”等键的LinkedTreeMap