当前位置: 首页 > 知识库问答 >
问题:

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

司徒翼
2023-03-14

这个REST查询提供了created_at日期。我想解析输出以获取所有日期,然后对它们进行排序。我需要分析的问题是

  "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;
}

共有1个答案

韦星文
2023-03-14

好吧,我咬一口:

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;
        }
    }

}

输出:

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

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

  • 另见:https://xkcd.com/1179/

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

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

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

注意Java内置的Java的使用。netclasses-此处不需要第三方HTTP库。

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

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

  • http://docs.oracle.com/javaee/7/api/index.html?javax/json/package-树。html
 类似资料:
  • 问题内容: 我知道这一定是相对简单的,但是我有一个JSON数据集,我想按日期排序。到目前为止,我无处不在遇到问题。现在,我将日期存储为。如果有帮助,我可以访问jquery,但是我意识到.sort()是本机JS。提前致谢。 问题答案: 假设您有一个javascript对象数组,只需使用自定义排序功能即可: Array 方法使用回调函数对数组进行排序,该回调函数传递给数组中的元素对。 如果返回值为负,

  • 我有JSON输出: 我可以将其存储在列表结构中,如下所示: 我也试过了,这个代码不行 如何按日期属性对列表中的数据进行排序?对于本例,必须对其进行排序:id为24的第一个对象id为25的第二个对象id为26的第三个对象id为27的第四个对象

  • 问题内容: 原谅我是我不熟悉ObjectiveC。 我从/ Date(xxxxxxxxxxxxx-xxxx)/格式的.NET Web服务获取日期。我正在寻找有关如何最好地将其解析为NSDate对象的方向。我曾尝试在其上使用dateWithTimeIntervalSince1970,但它返回的日期是1969年,而我知道该日期是2006年。 寻找正确的方法来处理JSON日期的方向。 提前致谢! 问题答

  • 问题内容: 我正在尝试解析json请求中的Datetime。该请求看起来像这样: 它被解码成的结构看起来像这样: 解码行如下所示: Revel返回此错误: 根据此处的revel文档,https://revel.github.io/manual/parameters.html 在同一文档中,他们还说您可以附加如下格式: 为了验证格式是否在数组中,我尝试了以下方法: 在绝望的最后一幕中,我尝试以rev

  • 问题内容: 我有一个json数组,我尝试 按日期对它 进行 排序, 然后再附加它。 该数组如下所示: 目前, 我已经设法对 日期 数组 进行了如下 排序 : 这给了我: 但 我不确定如何对 包含多个键 的复杂数组执行相同的操作 。我知道 我应该先将日期格式设置为YYYY-MM-DD, 但之后会有点混乱。 一个良好的开端将是我目前在jsbin上找到的内容:http ://jsbin.com/ipat

  • 我需要按照格式解析日期,但它没有很好地工作。 我需要日期对象在07/06/2013格式,即使日期是任何格式。但parse方法总是在2013年6月7日00:00:00 PKT星期五返回。