通常情况下,每个需要访问网络的应用都会有一个自己的服务器,我们可以向服务器提交数据,也可以从服务器上获取数据。不过这个时候就会出现一个问题,这些数据到底要以什么样的格式在网络上传输呢?随便传递一段文本肯定是不行的,因为另一方就不会知道这段文本的用途是什么。因此,一般我们都会在网络上传输一些格式化后的数据,这种数据会有一定的结构规格和语义,当另一方收到数据消息之后就可以按照相同的结构规格进行解析,从而取出他想要的那部分内容。
在网络上传输数据时,最常用的格式有两种:XML和JSON 。
这里我们来试试解析Json格式。
这里我使用YAPI来弄数据。
我们把数据放到Web服务器后,就可以开始在Android程序中解析这些数据了。
解析方法:
使用Gson :
首先记得添加依赖:
File > Project Structure>Dependencies >app>
Librery Dependency > gson
Gson 主要就是可以将一段JSON格式的字符串自动映射成一个对象,从而不需要我们在手动去编写代码进行解析。
比如说一段JSON格式的数据如下:
{"name":"Tom","age":20}
那么我们就可以定一个Person类,并加入name和age两个字段,然后只需要简单地调用如下代码就可以将JSON数据自动解析成一个Person对象了:
Gson gson = new Gson(); Person person = gson.fromJson(jsonData,Person.class);
如果需要解析一段JSON数组会稍微麻烦一点,我们需要借助TypeToken将期望解析成的数据类型传入到fromJson()方法中,如下所示:
List<Person> people = gson.fromJson(jsonData,new TypeToken<List<Person>>(){}.getType();
现在我们来真正实现一下,
先新增加一个App类,并加入字段id,name和version这3个字段:
package com.example.webviewapplication; public class App { private String id; private String name; private String version; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } }
然后再在MainActivity中修改代码:
package com.example.webviewapplication; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; import android.widget.TextView; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; import java.util.List; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class MainActivity extends AppCompatActivity { private Button send,upload; private TextView txt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); send = findViewById(R.id.send_request); txt = findViewById(R.id.response_txt); upload = findViewById(R.id.upload); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //发出一条http请求 new Thread(new Runnable() { @Override public void run() { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("http://10.0.2.2/get_data.json") .build(); try { Response response = client.newCall(request).execute(); String responseData = response.body().string(); parseJsonByGson(responseData); } catch (IOException e) { e.printStackTrace(); } } }).start(); } }); } private void parseJsonByGson(String responseData) { Gson gson = new Gson(); List<App> appList = gson.fromJson(responseData,new TypeToken<List<App>>(){}.getType()); for(App app:appList){ Log.d("MainActivity","id is "+ app.getId()); Log.d("MainActivity","name is "+app.getName()); Log.d("MainActivity","version is "+app.getVersion()); } } }