通常情况下,每个需要访问网络的应用都会有一个自己的服务器,我们可以向服务器提交数据,也可以从服务器上获取数据。不过这个时候就会出现一个问题,这些数据到底要以什么样的格式在网络上传输呢?随便传递一段文本肯定是不行的,因为另一方就不会知道这段文本的用途是什么。因此,一般我们都会在网络上传输一些格式化后的数据,这种数据会有一定的结构规格和语义,当另一方收到数据消息之后就可以按照相同的结构规格进行解析,从而取出他想要的那部分内容。
在网络上传输数据时,最常用的格式有两种: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());
}
}
}