我可以从网址获取JSON吗?

时间:2016-01-05 12:17:42

标签: android json parsing

美好的一天,我有这个链接:http://satiksme.daugavpils.lv/ru-tramvajs-nr-1-butlerova-iela-stacija

请选择源代码视图或使用:

view-source:http://satiksme.daugavpils.lv/ru-tramvajs-nr-1-butlerova-iela-stacija

如果您使用CTRL + F并放置var data =,则可以找到JSON对象。

问题是:我可以使用Volley解析它,还是根本不是JSON?如果不是,我如何解析它到我的应用程序(SQLite)? (使用凌空,或者GSON)?

2 个答案:

答案 0 :(得分:2)

你可以用Volley& GSON,但你必须做一些工作:

  1. 使用Volley(以字符串形式)以纯文本格式下载您的页面
  2. 在整个结果中,查找字符串var data =以获取正确的行号。
  3. 提取此行,删除var data =部分
  4. 使用GSON反序列化此提取的JSON
  5. 您可能希望implement a custom request执行parseNetworkResponse(NetworkResponse response)方法中的所有繁重工作。这将确保所有长任务都将在主线程中执行,并且不会冻结您的应用。

答案 1 :(得分:2)

@ pdegand59的帖子是g8,但如果你仍然在努力解决这个问题,那么这里是演示。

    private static TextView text;
    Pattern MY_PATTERN = Pattern.compile("var data = (.*)");
    String url="http://satiksme.daugavpils.lv/ru-tramvajs-nr-1-butlerova-iela-stacija";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView) findViewById(R.id.text);
        RequestQueue queue = Volley.newRequestQueue(this);
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override
                    //here you are downloading your page into a response string
                    public void onResponse(String response) { 
                        //regexp search for data
                        Matcher m = MY_PATTERN.matcher(response); 

                        if (m.find()) {
                            String extracted = m.group(1).trim();
                            try {
                                //HERE is Json obj you are looking for
                                JSONObject obj = new JSONObject(extracted); 
                                int spacesToIndentEachLevel = 2;
                                text.setText(obj.toString(spacesToIndentEachLevel));
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                text.setText("error");
            }
        });
        queue.add(stringRequest);
    }

<强> activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentEnd="true"
            android:layout_alignParentTop="true"
            android:layout_alignParentStart="true" />
    </RelativeLayout>

</ScrollView>

在build.gradle中,您还需要compile 'com.mcxiaoke.volley:library-aar:1.0.0'或类似于您的Volley的东西。

在清单中添加<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>