从接口获取一大堆字符串的时候,需要通过解析保存到 Bean类里面使用,网上有很多开源框架Gson,Jackson可以实现,不过有一句话是怎么说的,对,就是只会用框架的程序员不是一个好的程序员
你们只需要记住json解析方式是一种轻量级的数据传输格式,比任何数据传输性能要高出很多
http://v.juhe.cn/toutiao/index?type=&key=d05b58fa6901ad9bed77a1ef08bd6ccb
这是从 聚合数据上获取下来 的 字符串
看的是不是不清楚,这就需要一个工具给它排序 https://www.bejson.com/ 这是我从网上找的在线解析工具,看下返回的数据
{
"reason":"成功的返回",
"result":{
"stat":"1",
"data":[
{
"uniquekey":"4aa8ba3a720a12f1ac9b0ea2b7c1bb8b",
"title":"中国贸促会:加强投资 推动“一带一路”建设",
"date":"2018-04-12 18:09",
"category":"头条",
"author_name":"央视网",
},
{
"uniquekey":"d53883da51e856c2c96c8b219c6d06e7",
"title":"冯俊:人类命运共同体 全球治理的中国方案",
"date":"2018-04-12 16:06",
"category":"头条",
}
]
},
}
是不是变清晰了好多,不过对于第一次接触这个json解析的程序员还是有点乱,所以为了让你们更加明白,我又换了一个工具JsonView,百度可搜
接下来就需要 最主要的两个类:
大概就是这样,我们简单获取你想要的一个数据,我想得到data里面 0 开头 里面的title,下面来看代码:
//第一步,string参数相当于一个JSON,依次解析下一步
JSONObject json = new JSONObject(string);
JSONObject result = json.getJSONObject("result");
//当你获得JSONArray 类型的时候,然后要写for循环遍历获取里面每一个Object
JSONArray data = result.getJSONArray("data");
for (int i = 0; i < data.length(); i++) {
JSONObject value = data.getJSONObject(i);
//获取到title值
String title = value.getString("title");
// String title = value.optString("title");
}
optString和getString效果是一样的,我比较推荐getString
Activity文件
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
String urlString = "http://v.juhe.cn/toutiao/index?type=&key=d05b58fa6901ad9bed77a1ef08bd6ccb\n";
private TextView mTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTv = findViewById(R.id.tv);
Button bt = findViewById(R.id.bt);
bt.setOnClickListener(this);
}
private Handler hand = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 1) {
String title = (String) msg.obj;
mTv.setText(title);
}
}
};
@Override
public void onClick(View v) {
//转换编码格式
// final String encode = URLEncoder.encode(null, "utf-8");
new Thread(new Runnable() {
@Override
public void run() {
try {
//打开链接
URL url = new URL(urlString);
//找到输入流
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
//添加到缓冲输入区里
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//字符串变量
StringBuffer sb = new StringBuffer();
String s = "";
//一行一行读下来
while ((s = br.readLine()) != null) {
sb.append(s);
}
br.close();
is.close();
String string = sb.toString();
//第一步,参数相当于一个JSON,依次解析下一步
JSONObject json = new JSONObject(string);
JSONObject result = json.getJSONObject("result");
//当你获得Array类型的时候,然后要遍历获取代表里面面每一个个Object
JSONArray data = result.getJSONArray("data");
for (int i = 0; i < data.length(); i++) {
JSONObject value = data.getJSONObject(i);
String title = value.getString("title");
// String title = value.optString("title");
Log.e("sss", title);
//传送
Message message = hand.obtainMessage();
message.what = 1;
message.obj = title;
hand.sendMessage(message);
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
}
布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.zk.jsonanalysis.MainActivity">
<Button
android:id="@+id/bt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="点击设置文字"
android:textColor="#ff223B" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ff223B"
android:text="标题:"
android:textSize="25sp" />
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="aa"
android:textSize="25sp" />
LinearLayout>
LinearLayout>
1.方法后面的参数必须跟json字符串里面的值依依对应,要不然会提示为空,报出异常
2.如果使用集合存储对象,创建bean的时候,里面的声明变量也要跟json字符串名字依依对应
3.老铁双击666没毛病!!!