天天看點

android處理從伺服器傳回的嵌套json

總結了一番,感覺是要将json轉換成javabean對象

1.Actor-user Demo

android處理從伺服器傳回的嵌套json

畫紅圈的地方是我在采用第三種方式時遇到的一個問題,這個地方報了錯:

 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^