首先感谢下面这个文章的作者,从他的文章找到了方法,我也也是在其方法之上进行的改进。
android studio 3.5上运行通过。api17-api30都正常运行。
用android 本身的库解析json.
解析json数据一(基本json结构):
{
"name":"张三",
"age":34,
"hobby":"没啥爱好"
}
解析json数据二(复杂结构):
{ "person":[
{
"name":"小二",
"age":19,
"sex":"男"
},
{
"name":"小三君",
"age":18,
"sex":"女"
},
{
"name":"小四",
"age":16,
"sex":"男"
}
]
}
具体json结构就不讲了,网上很多。主要说下我遇到的”坑“,就是我一直不理解的什么对象,什么列表,以及解析的过程。在我看了不下大几十篇文章后,终于明白了一点。其他json解析的方法网上也有很多。
对象就是{.... }(大括号)内的东西,也叫json对象。
列表就是[... ](中括号)内的东西,这个跟Python一样。
其他就是要一层层解析,好像不可以越层,我现在还不知道,估计要不了多久就知道了。
然后其他就基本是固定的。照写就行了。
布局:
我在布局里面用了两个框架,其他没必要。但懒得改。
用了12个TextView,用于显示内容。
1-3显示简单结构的json。
4-12显示的是复杂结构的json。这部分本来可以简化代码,用循环解析并动态生成TextView的方法,但我还没学会,正在研究。
java:
直接看代码吧,我连名词可能都会说错,关键代码看原作者的注释还好。
content_main.xml文件: ?
<?xml version="1.0" encoding="utf-8"?>
<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"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:showIn="@layout/activity_main">
<FrameLayout
android:id="@+id/ll_show"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="80dp"
android:textSize="30dp"
android:text="TextView" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="130dp"
android:textSize="30dp"
android:text="TextView" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="180dp"
android:textSize="30dp"
android:text="TextView" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="240dp"
android:orientation="horizontal">
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="30dp"
android:text="TextView" />
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="30dp"
android:text="TextView" />
<TextView
android:id="@+id/textView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="30dp"
android:text="TextView" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="280dp"
android:orientation="horizontal">
<TextView
android:id="@+id/textView7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="30dp"
android:text="TextView" />
<TextView
android:id="@+id/textView8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="30dp"
android:text="TextView" />
<TextView
android:id="@+id/textView9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="30dp"
android:text="TextView" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="320dp"
android:orientation="horizontal">
<TextView
android:id="@+id/textView10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="30dp"
android:text="TextView" />
<TextView
android:id="@+id/textView11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="30dp"
android:text="TextView" />
<TextView
android:id="@+id/textView12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="30dp"
android:text="TextView" />
</LinearLayout>
</FrameLayout>
</LinearLayout>
MainActivity.java文件:
package com.example.test;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.List;
import static java.sql.DriverManager.println;
public class MainActivity extends AppCompatActivity {
//private String json ="{\"code\":\"200\",\"updateTime\":\"2021-12-26T03:35+08:00\",\"fxLink\":\"http://hfx.link/1u0y1\",\"daily\":[{\"fxDate\":\"2021-12-26\",\"sunrise\":\"07:01\",\"sunset\":\"17:47\",\"moonrise\":\"00:00\",\"moonset\":\"11:58\",\"moonPhase\":\"亏凸月\",\"moonPhaseIcon\":\"805\",\"tempMax\":\"13\",\"tempMin\":\"6\",\"iconDay\":\"305\",\"textDay\":\"小雨\",\"iconNight\":\"305\",\"textNight\":\"小雨\",\"wind360Day\":\"45\",\"windDirDay\":\"东北风\",\"windScaleDay\":\"4-5\",\"windSpeedDay\":\"34\",\"wind360Night\":\"45\",\"windDirNight\":\"东北风\",\"windScaleNight\":\"3-4\",\"windSpeedNight\":\"24\",\"humidity\":\"87\",\"precip\":\"1.0\",\"pressure\":\"1019\",\"vis\":\"17\",\"cloud\":\"55\",\"uvIndex\":\"1\"},{\"fxDate\":\"2021-12-27\",\"sunrise\":\"07:02\",\"sunset\":\"17:47\",\"moonrise\":\"00:02\",\"moonset\":\"12:33\",\"moonPhase\":\"下弦月\",\"moonPhaseIcon\":\"806\",\"tempMax\":\"9\",\"tempMin\":\"6\",\"iconDay\":\"305\",\"textDay\":\"小雨\",\"iconNight\":\"350\",\"textNight\":\"阵雨\",\"wind360Day\":\"45\",\"windDirDay\":\"东北风\",\"windScaleDay\":\"3-4\",\"windSpeedDay\":\"24\",\"wind360Night\":\"45\",\"windDirNight\":\"东北风\",\"windScaleNight\":\"1-2\",\"windSpeedNight\":\"3\",\"humidity\":\"78\",\"precip\":\"5.1\",\"pressure\":\"1018\",\"vis\":\"24\",\"cloud\":\"80\",\"uvIndex\":\"1\"},{\"fxDate\":\"2021-12-28\",\"sunrise\":\"07:02\",\"sunset\":\"17:48\",\"moonrise\":\"00:58\",\"moonset\":\"13:09\",\"moonPhase\":\"残月\",\"moonPhaseIcon\":\"807\",\"tempMax\":\"16\",\"tempMin\":\"8\",\"iconDay\":\"101\",\"textDay\":\"多云\",\"iconNight\":\"151\",\"textNight\":\"多云\",\"wind360Day\":\"45\",\"windDirDay\":\"东北风\",\"windScaleDay\":\"1-2\",\"windSpeedDay\":\"3\",\"wind360Night\":\"45\",\"windDirNight\":\"东北风\",\"windScaleNight\":\"3-4\",\"windSpeedNight\":\"16\",\"humidity\":\"74\",\"precip\":\"0.0\",\"pressure\":\"1015\",\"vis\":\"25\",\"cloud\":\"5\",\"uvIndex\":\"4\"}],\"refer\":{\"sources\":[\"QWeather\",\"NMC\",\"ECMWF\"],\"license\":[\"no commercial use\"]}}";
private TextView textView;
private TextView textView2;
private TextView textView3;
private TextView textView4;
private TextView textView5;
private TextView textView6;
private TextView textView7;
private TextView textView8;
private TextView textView9;
private TextView textView10;
private TextView textView11;
private TextView textView12;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
textView=findViewById(R.id.textView);
textView2=findViewById(R.id.textView2);
textView3=findViewById(R.id.textView3);
textView4=findViewById(R.id.textView4);
textView5=findViewById(R.id.textView5);
textView6=findViewById(R.id.textView6);
textView7=findViewById(R.id.textView7);
textView8=findViewById(R.id.textView8);
textView9=findViewById(R.id.textView9);
textView10=findViewById(R.id.textView10);
textView11=findViewById(R.id.textView11);
textView12=findViewById(R.id.textView12);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
analyzeJSON1();
analyzeJSONArray2();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void analyzeJSON1() {
String TAG ="";
String result = "{\n" +
" \"name\":\"张三\",\n" +
" \"age\":34,\n" +
" \"hobby\":\"没啥爱好\"\n" +
"}";
// Log.d(TAG, "result:" + result);
try{
JSONObject jsonObject = new JSONObject(result);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
String age1= Integer.toString(age);
String hobby = jsonObject.getString("hobby");
textView.setText(name);
textView2.setText(age1);
textView3.setText(hobby);
} catch (Exception e) {
e.printStackTrace();
}
}
public void analyzeJSONArray2() {
String result = "{\n" +
" \"person\":[\n" +
" {\n" +
" \"name\":\"小二\",\n" +
" \"age\":19,\n" +
" \"sex\":\"男\"\n" +
" },\n" +
" {\n" +
" \"name\":\"小三\",\n" +
" \"age\":18,\n" +
" \"sex\":\"女\"\n" +
" },\n" +
" {\n" +
" \"name\":\"小四\",\n" +
" \"age\":16,\n" +
" \"sex\":\"男\"\n" +
" }\n" +
" ]\n" +
"}";
try{
/**
* JSON数组在牛逼,一旦有了 key person 这样的标记,就必须先是个 JSON对象
* 最外层的JSON对象,最大的哪个 { ... }
*/
JSONObject jsonObjectALL = new JSONObject(result);
// 通过标识(person),获取JSON数组
JSONArray jsonArray = jsonObjectALL.getJSONArray("person");
JSONObject jsonObject = jsonArray.getJSONObject(0);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
String age1=Integer.toString(age);
String sex = jsonObject.getString("sex");
textView4.setText(name);
textView5.setText(age1);
textView6.setText(sex);
JSONObject jsonObject1 = jsonArray.getJSONObject(1);
String name1 = jsonObject1.optString("name", null);
int age11 = jsonObject1.optInt("age", 0);
String age1a=Integer.toString(age11);
String sex1 = jsonObject1.optString("sex", null);
textView7.setText(name1);
textView8.setText(age1a);
textView9.setText(sex1);
JSONObject jsonObject2 = jsonArray.getJSONObject(2);
String name2 = jsonObject2.optString("name", null);
int age2 = jsonObject2.optInt("age", 0);
String age21=Integer.toString(age2);
String sex2 = jsonObject2.optString("sex", null);
textView10.setText(name2);
textView11.setText(age21);
textView12.setText(sex2);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
?
|