android处理从服务器返回的嵌套json

总结了一番,感觉是要将json转换成javabean对象

1.Actor-user Demo

画红圈的地方是我在采用第三种方式时遇到的一个问题,这个地方报了错:

 Cannot resolve constructor 'JSONObject(com.example.gsontest.Actor)'

错误: 对于JSONObject(Actor), 找不到合适的构造器 构造器 ...

目前不知道怎么解决QAQ

所以干脆换了Gson来生成json

我把博主的小demo改了一哈,顺便模拟了一下服务器返回数据之后,怎么从线程里传到主线程


import java.util.List;


public class Actor {
    private String name;
    private List<Fans> fans;
    public Actor(){}

    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    public List<Fans> getFans(){
        return this.fans;
    }
    public void setFans(List<Fans> fans){
        this.fans = fans;
    }
}
package com.example.gsontest;

public class Fans {
    private String name;
    private int age;
    public String getName(){
        return this.name;
    }
    public void setName(String name){
        this.name = name;
    }
    public int getAge(){
        return this.age;
    }
    public void setAge(int age){
        this.age = age;
    }
}
package com.example.gsontest;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {
    private final int LIST_INFO = 1;
    private String name = "";
    @SuppressLint("HandlerLeak")
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case LIST_INFO:
                    String res = msg.obj.toString();
                    name = beanParse(res);
                    break;

            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        beanCreatejson();
        initData();
        Log.d("fan0 name", name);
    }
    public void initData(){

        new Thread(){
            public void run(){
//由于没有写服务器端的,直接用了原博主的例子,就没有写上请求连接等等等的东东
                String jsonString = "{\"fans\":[{\"name\":\"小王\",\"age\":7},"+
"{\"name\":\"小尼玛\",\"age\":10}],\"name\":\"王尼玛\"}";
                Message message = Message.obtain();
                message.what = LIST_INFO;
                message.obj = jsonString;
                handler.sendMessage(message);
            }
        }.start();
//        beanParse(jsonString);
    }
    public void beanCreatejson(){
        Actor actor = new Actor();
        actor.setName("王尼玛");
        Fans fan1 = new Fans();
        fan1.setName("小明");
        fan1.setAge(10);

        Fans fan2  = new Fans();
        fan2.setName("小时");
        fan2.setAge(12);

        List<Fans> fans = new ArrayList<>();
        fans.add(fan1);
        fans.add(fan2);
        actor.setFans(fans);
        Gson gson = new Gson();
        System.out.println("java bean创建json对象:" + gson.toJson(actor));

    }
    public String beanParse(String jsonStr){
        JsonObject obj = new JsonParser().parse(jsonStr).getAsJsonObject();
//        {"fans":[{"name":"小王","age":7},{"name":"小尼玛","age":10}],"name":"王尼玛"}
        Actor actor = new Gson().fromJson(obj, Actor.class);
        System.out.println("name" + obj.get("name"));
       /* System.out.print("fans\n");
        for(Fans fans: actor.getFans())
        System.out.println("name "+ fans.getName() + ",age " + fans.getAge());*/
        List<Fans> fan = actor.getFans();
        return fan.get(0).getName();

    }
}

2.json数组数据还能怎么解析哇QAQ

这位博主用栗子讲明了当我们拿到服务器那边返回的超长json,但有时候可能只要一部分的数组,这时候怎么搞,当然是掐住要害啦

比如我拿到了这样子的稍微长一点的json

  String jsonStr = "{\"albumModel\":[{\"albumId\":1,\"name\":\"第一歌单\",\"picture\":\"c1_s.jpg\"},{\"albumId\":2,\"name\":\"第二歌单\",\"picture\":\"c2_s.jpg\"},{\"albumId\":3,\"name\":\"第三歌单\",\"picture\":\"c3_s.jpg\"}],\"msg\":\"success\"}";

我现在想要的是将albumModel数组解析出来;

这时候我们可以这样子

  public void beanParase(String jsonStr){

        JsonObject obj = new JsonParser().parse(jsonStr).getAsJsonObject();
        JsonArray array = obj.getAsJsonArray("albumModel");

        List<AlbumModel> list= new ArrayList<>();

        for(JsonElement album: array){
           AlbumModel albumModel = new Gson().fromJson(album, new TypeToken<AlbumModel>() {}.getType());
           list.add(albumModel);
        }

    }

AlbumModel类

package com.example.musicmain.models;

import java.util.List;

public class AlbumModel {
    private int albumId;
    private String name;
    private String picture;
   /* private int playNum;
    private List<MusicModel> list;*/

    public int getAlbumId(){
        return this.albumId;
    }
    public void setAlbumId(int albumId){
        this.albumId = albumId;
    }
    public String getName(){
        return this.name;
    }
    public void setName(String name){
        this.name = name;
    }
    public void setPicture(String picture){
        this.picture = picture;
    }
    public String getPicture(){
        return this.picture;
    }

}

如果是没有数组头的话,参考博主的说明,对萌新超级有用^v^

猜你喜欢

转载自blog.csdn.net/weixin_39296576/article/details/91346637
今日推荐