android handle nested json returned from the server

Summed up a lot, feeling that you want to convert json object is javabean

1.Actor-user Demo

Circled in red is where I encountered a problem when using a third way, the local newspaper a mistake:

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

Error: For JSONObject (Actor), can not find a suitable constructor constructor ...

At present we do not know how to solve QAQ

So just for a Gson to generate json

After I put the blogger's changed a little demo Kazakhstan, simulate the way a bit server returns data, how spread from the main thread thread


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 array data but also how to resolve wow QAQ

The blogger with chestnuts made it clear that when we got there the server returned long json, but sometimes may be as long as a part of the array, this time how this, of course, is the key grabbed it

For example, I got a little bit longer json like this

  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\"}";

I want now is to parse out albumModel array;

At this time we can like this

  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 class

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;
    }

}

If there is no array header, it indicates a reference bloggers, super useful for sprouting new ^ v ^

Guess you like

Origin blog.csdn.net/weixin_39296576/article/details/91346637