【问题标题】:how to retrieve data from URL which is not a JSON object into android listView?如何从不是 JSON 对象的 URL 中检索数据到 android listView 中?
【发布时间】:2018-12-12 21:00:32
【问题描述】:

我有This URL,我想在一个 android 列表视图中获取这里的所有数据,我只知道如何从 JSON 对象中检索数据,但在这里我什至不知道这些数据的格式在网址中。

网址格式为:
tvg-logo = logo chanel的url

group-title = 您需要显示频道的类别(仅适用于电影而非电视)

在“,”之后是频道的名称

在名字之后你有视频的 URL

如何从 URL 解析我的数据,以便我可以制作这样的列表视图:

【问题讨论】:

标签: android listview m3u


【解决方案1】:

解决办法是:

  1. 您可以从 python 库(如 scrapy 或 beautiful soup)中抓取数据,然后将其转换为 json 并从 android 读取。

  2. 使用 jsoup 库 (https://jsoup.org/) 解析 html,并以您想要的格式对数据建模。

【讨论】:

    【解决方案2】:

    试试下面的代码,这里我只从 api 响应中提取 url

        String strData = "#EXTM3U #EXTINF:-1 tvg-logo=\"http://www.cinecosta.com/image-appletv/tv/tf1-tv.png\" tvg-categorie=\"TV\",TF1 http://217.182.164.103:25461/live/YnAmpNBQUX/YUCgme6CXS/314.ts #EXTINF:-1 tvg-logo=\"http://www.cinecosta.com/image-appletv/tv/france2.png\" tvg-categorie=\"TV\",France 2 http://217.182.164.103:25461/live/YnAmpNBQUX/YUCgme6CXS/315.ts #EXTINF:-1 tvg-logo=\"http://www.cinecosta.com/image-appletv/tv/france3.png\" tvg-categorie=\"TV\",France 3 http://217.182.164.103:25461/live/YnAmpNBQUX/YUCgme6CXS/316.ts #EXTINF:-1 tvg-logo=\"http://www.cinecosta.com/image-appletv/tv/france4.png\" tvg-categorie=\"TV\",France 4 http://217.182.164.103:25461/live/YnAmpNBQUX/YUCgme6CXS/317.ts #EXTINF:-1 tvg-logo=\"http://www.cinecosta.com/image-appletv/tv/france5.png\" tvg-categorie=\"TV\",France 5 http://217.182.164.103:25461/live/YnAmpNBQUX/YUCgme6CXS/318.ts";
    
    private void convertDataToArray() {
        String[] splitArray = strData.split("#EXTINF:-");
        ArrayList<String> arrstrUrl = new ArrayList<String>();
        ArrayList<String> arrstrMainUrl = new ArrayList<String>();
        ArrayList<String> arrstrCategory = new ArrayList<String>();
        ArrayList<String> arrstrName = new ArrayList<String>();
        for (int i = 1; i < splitArray.length; i++) {
            System.out.println("Final=>" + splitArray[i]);
            arrstrUrl.add(splitArray[i].split("1 tvg-logo=")[1].split(" ")[0]);
            arrstrMainUrl.add("http" + splitArray[i].split("1 tvg-logo=")[1].split("tvg-categorie=")[1].split("http")[1]);
            arrstrName.add(splitArray[i].split("1 tvg-logo=")[1].split("tvg-categorie=")[1].split(",")[0]);
            arrstrCategory.add(splitArray[i].split("1 tvg-logo=")[1].split("tvg-categorie=")[1].split(",")[1].split("http")[0]);
        }
        System.out.println("Final Image=>" + arrstrUrl.toString());
        System.out.println("Final Main=>" + arrstrMainUrl.toString());
        System.out.println("Final Name=>" + arrstrName.toString());
        System.out.println("Final Category=>" + arrstrCategory.toString());
    }
    

    这样,您可以解析数据并更新列表视图。

    注意:-您需要编写自己的逻辑来解析这些数据,方法是检查数据模式。

    【讨论】:

    • 你不认为它是硬编码的,是否可以将文件中的全部内容复制到一个字符串中?还有什么方法可以将这些数据转换为 JSON 对象?
    • 无法将此数据转换为 JSON 对象。因此,如果模式与当前响应相同,则必须像我使用的那样使用正则表达式进行解析。
    • @abbujan,您在评论中有一个上面的 github url。如果你探索那个 git 库,你会发现他们也在使用自己的 Parser 类来解析数据。
    • Anil 有什么办法可以让网址出现在#EXTINF: 之前,或者我应该说最后带有“.ts”的那个?
    • @abbujan,我已经编辑了这个函数,现在试试吧,你会得到arraylist中创建你的UI所需的所有数据。
    【解决方案3】:

    如果您使用改造作为网络库,那么您可以在 api 回调函数中传递“ResponseBody”。在 onSuccess 方法中我们将获取 Body 并使用以下代码。

    接口类:

    Call<ResponseBody>  yourFuncationName();
    
    
    ResponseBody data = (ResponseBody) model.body();
                String json = getStringData(data.byteStream());
    

    功能是

    public String getStringData(InputStream inputStream) {
        BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
        StringBuilder total = new StringBuilder();
        String line;
        try {
            while ((line = r.readLine()) != null) {
                total.append(line).append('\n');
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return total.toString();
    }
    

    也许这对你有帮助。

    【讨论】:

      【解决方案4】:

      结果似乎很容易解析。看看模式。 #SOMETHING tvg-logo="logo" tvg-categorie="something"

      使用正则表达式拆分您想要的模式。 Regex

      【讨论】:

        【解决方案5】:

        此函数将从 URL 获取数据,您可以根据需要拆分数据并填充 UI。

        void fetchDataFromUrl() {
                try {
                    URL oracle = new URL("http://cinecosta.com/api_tv.php?pass=yojeju123");
                    URLConnection yc = oracle.openConnection();
                    BufferedReader in = new BufferedReader(new InputStreamReader(
                            yc.getInputStream()));
                    String inputLine;
                    while ((inputLine = in.readLine()) != null)
                        System.out.println(inputLine);
                    in.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        

        【讨论】:

        • 这似乎不起作用,inputLine 中没有存储任何内容,您可以交叉检查一下吗?
        【解决方案6】:

        我认为,您必须用特殊字符分割字符串文本。并将它们保存在一个数组中。例如,特殊字符可能是“[空格字符]”或“,”或“#”。 希望能帮到你

        【讨论】:

          猜你喜欢
          • 2021-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-27
          • 2016-09-28
          • 2018-08-06
          • 1970-01-01
          • 2021-10-04
          相关资源
          最近更新 更多