android - 使用 GSON 从 URL 解析 JSON

标签 android json url gson

我正在寻找一种方法来从 URL 解析 JSON 字符串,然后将其传递给 GSON 以对其进行反序列化。我的目标是将转换后的文本放入 RecyclerViewAdapter。

我已经尝试执行建议和建议 Parsing JSON from URL但 这种方法对我不起作用。

首先,我创建了一个具有 4 个属性的 JavaObject 类(称为数据)。这些属性与我的 URL 中的字段相同:

public class Data {

    private String title;
    private String version;
    private String kind;
    private String etag;

    public String getTitle() {
        return title; 
    }
    public String getVersion() {
        return version; 
    }
    public String getKind() {
        return kind; 
    }
    public String getEtag() {
        return etag; 
    }

    public void setTitle(String title) {
        this.title = title;
    }
    public void setVersion(String version) {
        this.version = version; 
    }
    public void setKind(String kind) {
        this.kind = kind; 
    }
    public void setEtag(String etag) {
        this.etag = etag; 
    }


    public String toString() {
        return String.format("title: %s, "
                        + "version: %s, "
                        + "kind: %s, "
                        + "etag: %s",
                title, version, kind, etag);
    }
}

从我的 URL 获取数据并通过 GSON 进行转换的过程应该发生在我的 fragment 的以下 onCreateView 方法中:

 public class Fragment extends android.support.v4.app.Fragment {
   public static final String FRAGMENT_TAG = "Fragment";
   private OnListFragmentInteractionListener mListener; 

   public Fragment() {

  }

  @Override
  public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    Log.i(FRAGMENT_TAG, "onCreate()");
    setHasOptionsMenu(true);
 }


public View onCreateView(LayoutInflater inflater, ViewGroup container,       
                         Bundle savedInstanceState) {
    Log.i(JSONS_FRAGMENT_TAG, "onCreateView()");
    View view = inflater.inflate(R.layout.fragment_jsons_list, container, 
   false);
    if (view instanceof RecyclerView) {
        Context context = view.getContext();
        RecyclerView recyclerView = (RecyclerView) view;

        URL url = null;
        try {
            // Definition of the URL with the JSON-Strings
            url = new URL("http://www.jsoneditoronline.org
            /?id=b1b4f5e2526ab04b562723bccae30a40");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        InputStreamReader reader = null;
        try {
            // InputStreamReader is responsible to open and consume the  
            // URL
            reader = new InputStreamReader(url.openStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
      // Conversion via GSON
      Data data = new Gson().fromJson(reader, Data.class);

        List<Data> listdata = new ArrayList<Data>();
        listdata.add(data);
         recyclerView.setAdapter(new     
         JSONSRecyclerViewAdapter(listdata,mListener));
    }
    return view;
}

每次我尝试运行该应用程序时,它都会立即停止,并且 logcat 输出表明我的 onCreateView 方法存在问题。 logcat 输出如下:

    05-08 09:21:47.179 recandroidapp E/UncaughtException:        
        android.os.NetworkOnMainThreadException                                                                                                           
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303)
        at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:86)
        at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:74)
        at java.net.InetAddress.getAllByName(InetAddress.java:752)
        at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
        at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:187)
        at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:156)
        at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:98)
        at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:345)
        at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:328)
        at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:246)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:243)
        at java.net.URL.openStream(URL.java:1057)
        at recandroidapp.fragments.JSONSFragment.onCreateView(JSONSFragment.java:68)
        at android.support.v4.app.Fragment.performCreateView(Fragment.java:2080)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1108)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290)
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677)
        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:536)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6077)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

为了避免 NetworkOnMainThreadException,我尝试调用 AsyncTask(正如用户 play_err_、user12345 和 Aashish Aadarsh 在我最初发帖后所建议的——感谢您的帮助!)。 不幸的是,这会触发另一个关于 doInBackground() 方法的错误。 这是我在实现 AsyncTask 后收到的新 logcat 输出: enter image description here

您有什么想法/建议吗? 谢谢!

最佳答案

从您的代码看来,您正在主线程上执行 NW 调用,这将导致 NetworkOnMainThreadException

尝试在 AsyncTask 上进行 NW 调用,并在 postExceuteMethod 中处理数据(将数据发送到适配器)。

关于android - 使用 GSON 从 URL 解析 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43844145/

相关文章:

html - 使用 htaccess rewrite 使子目录成为其自己的根目录以用于根相对路径请求

android - 自 Android 4.0 以来,Camera.lock、unlock() 自动为您管理?

javascript - 使用 Ionic 进行地理定位

javascript - 将数据从一个数组复制到另一个数组

Session具体是做什么的?为什么不把ip和域名session看成一样呢?

javascript - 在不重新加载现有页面的情况下更改浏览器地址栏中的 URL

android - 如何为 Android 应用程序集成 meta io + Opencv?

android - 错误 : Trying to requery an already closed cursor

java - 如何使用 Jackson 和 JsonPointer 查找具有动态节点名称的值

java - 将嵌套 json 转换为点符号 json