在Java中解析JSON并按输出日期排序

在Java中解析JSON并按输出日期排序,java,rest,Java,Rest,这个REST查询提供了在日期创建的_。我想解析输出以获取所有日期,然后对它们进行排序。我需要解析的有问题的行如下所示 "created_at": "2013-01-08T20:11:48Z", 在此查询 https://api.github.com/search/repositories?q=language:Java 有没有一种有效的方法 我的密码到现在为止 public static String processRestResponse(String language){

这个REST查询提供了在日期创建的_。我想解析输出以获取所有日期,然后对它们进行排序。我需要解析的有问题的行如下所示

  "created_at": "2013-01-08T20:11:48Z",
在此查询

https://api.github.com/search/repositories?q=language:Java
有没有一种有效的方法

我的密码到现在为止

 public static String processRestResponse(String language){
    HttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet("https://api.github.com/search/repositories?q=language:" + language);
    HttpResponse response = null;
    BufferedReader rd = null;
    try {
        response = client.execute(request);
        rd = new BufferedReader
            (new InputStreamReader(
                    response.getEntity().getContent()));
    } catch (IOException e) {
        e.printStackTrace();
    }
    String line = "";

    String output  = language;
    try {
        while ((line = rd.readLine()) != null) {
            output += "\n" + line.substring(line.indexOf("\""), line.indexOf(",")) + "\n";
        }
    }catch (IOException e){}

    return output;
}
好吧,我咬一口:

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonStructure;
import javax.json.JsonValue;

public class StackOverflow44316515{

    public static void main(final String[] args) throws Exception{
        final StackOverflow44316515 example = new StackOverflow44316515();

        // Get data:
        final JsonObject jsonLangObjs = example.getLanguages("java");

        // Copy items into a mutable array:
        final JsonArray items = jsonLangObjs.getJsonArray("items");
        final JsonObject[] itemsArray = items.toArray(new JsonObject[items.size()]);

        // Sort the array:
        Arrays.sort(itemsArray, new Comparator<JsonValue>(){
            @Override
            public int compare(final JsonValue o1, final JsonValue o2){
                return ((JsonObject)o1).getString("created_at")
                    .compareTo(((JsonObject)o2).getString("created_at"));
            }

        });

        // Re-wrap in a list API for convenience (optional):
        final List<JsonObject> itemsArrayList = Arrays.asList(itemsArray);

        // Print sample:
        for(final JsonObject jo : itemsArrayList){
            System.out.println(jo.getString("created_at") + " - " + jo.getString("full_name"));
        }
    }

    public JsonObject getLanguages(final String language) throws Exception{
        final URL url = new URL("https://api.github.com/search/repositories?q=language:"
            + URLEncoder.encode(language, "UTF-8")
            + "&per_page=10");

        final HttpURLConnection huc = (HttpURLConnection)url.openConnection();
        if(huc.getResponseCode() != 200){
            throw new Exception("Error calling web service: "
                +  huc.getResponseCode() + " - " + huc.getResponseMessage());
        }

        try(final InputStream is = huc.getInputStream()){
            final JsonStructure json = Json.createReader(is).read();
            return (JsonObject)json;
        }
    }

}
-幸运的是,格式化日期是按照它们的字典顺序正确排序的——因此对于这样一个简单的练习,我们甚至不需要首先将它们解析为Java数据对象之类的东西

  • 另见:
请注意GitHub的服务器端分页,这是避免同时向您提供320多万个结果所必需的。对于这个例子,我将默认的30个结果限制为10个。如果您真的需要分析所有结果,我将把它作为练习留给读者。有一些关于这方面的额外细节

此示例代码假定在处创建的值始终存在于所有记录中。除非这是GitHub的API保证(即使是),否则应该在这里为生产代码添加额外的检查

请注意language参数的URL编码,以帮助防止注入攻击(假设“language”参数不受信任)

注意Java内置的
Java.net
类的使用-这里不需要第三方HTTP库

请注意,此代码不会捕获它无法处理的任何异常。一个空的catch块,甚至一个只输出异常的catch块,几乎总是对任何人都没有好处。(“好的,现在怎么办?”)也就是说,你真的想让代码继续运行,就好像什么都没发生一样吗

这段代码还将每组JSON结果构建到内存中的对象模型中(
JsonObjects
JsonArray
)。虽然这里的示例最简单,但更高效的实现将使用流接口,例如
JsonParser
。另见:


您使用哪个库进行HTTP调用?您可以发布获取存储库(但尚未排序)的代码吗?在其描述中,现在请使用适当的JSON解析库。可以是javax.json,也可以是链接到的任何其他组件。请在此处删除javax.swing/jframe组件。它们与您当前的工作无关…现在可以编辑-请查找
2010-02-08T13:20:56Z - elastic/elasticsearch
2010-09-06T21:39:43Z - square/retrofit
2012-07-23T13:42:55Z - square/okhttp
2013-01-08T20:11:48Z - ReactiveX/RxJava
2013-03-05T08:18:59Z - JakeWharton/butterknife
2013-07-08T22:52:33Z - bumptech/glide
2014-04-25T14:29:47Z - PhilJay/MPAndroidChart
2014-05-29T16:23:17Z - google/guava
2014-08-09T16:45:18Z - iluwatar/java-design-patterns
2015-04-29T23:54:16Z - square/leakcanary