将JSONArray转换为List<Object>?

13

我正在尝试将一个JSONArray反序列化为List。为此,我尝试使用Gson,但我不明白为什么它不起作用,JSON的所有值都是null。

我该怎么做?

JSON

{ "result" : [ 
      { "Noticia" : { 
            "created" : "2015-08-20 19:58:49",
            "descricao" : "tttttt",
            "id" : "19",
            "image" : null,
            "titulo" : "ddddd",
            "usuario" : "FERNANDO PAIVA"
          } },
      { "Noticia" : { 
            "created" : "2015-08-20 19:59:57",
            "descricao" : "hhhhhhhh",
            "id" : "20",
            "image" : "logo.png",
            "titulo" : "TITULO DA NOTICIA",
            "usuario" : "FERNANDO PAIVA"
          } }
    ] }

反序列化

List<Noticia> lista = new ArrayList<Noticia>();
                            Gson gson = new Gson();
                            JSONArray array = obj.getJSONArray("result");

                            Type listType = new TypeToken<List<Noticia>>() {}.getType();
                            lista = gson.fromJson(array.toString(), listType);

                            //testing - size = 2 but value Titulo is null
                            Log.i("LISTSIZE->", lista.size() +"");
                            for(Noticia n:lista){
                                Log.i("TITULO", n.getTitulo());
                            }

新闻类

public class Noticia implements Serializable {
    private static final long serialVersionUID = 1L;

    private Integer id;
    private String titulo;
    private String descricao;
    private String usuario;
    private Date created;
    private String image;

你执行array.toString()这个操作看起来有点奇怪。我会考虑遍历JSONArray并将每个元素转换为Noticia对象。 - Yair Zaslavsky
我在JsonObject (https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/JsonObject.html)上没有看到getJSONArray方法。请阅读我的答案。希望它能解决这个问题。 - Atul
5个回答

3
你的代码有两个问题:
  1. 首先,你正在使用 getJsonArray() 来获取数组,这不是 Gson 库的一部分,你需要使用 getAsJsonArray() 方法代替。
  2. 其次,你正在使用 array.toString(),这不明显,因为对于 fromJson 方法,你需要一个 jsonArray 作为参数而不是 String,这会导致解析问题,所以只需将其删除。
请使用以下代码将你的 jsonArray 转换为 List<Noticia>
Type type = new TypeToken<List<Noticia>>() {}.getType();
List<Noticia> lista = gson.fromJson(array, type);

你的整个代码将是:

Gson gson = new Gson();
JSONArray array = obj.getAsJsonArray("result");

Type type = new TypeToken<List<Noticia>>() {}.getType();
List<Noticia> lista = gson.fromJson(array, type);

//testing - size = 2 but value Titulo is null
Log.i("LISTSIZE->", lista.size() +"");
for(Noticia n:lista){
   Log.i("TITULO", n.getTitulo());
}

感谢您的关注。变量 obj 是一个 JSONObject,没有 getAsJsonArray 方法。当我尝试使用 obj.getAsJsonArray("result") 时,因为没有此方法而无法正常工作。我该怎么做呢? - FernandoPaiva
@FernandoPaiva,我认为您正在使用org.json,因此您只需像在问题中那样使用obj.getJSONArray()即可。 - cнŝdk
fromJson方法的第一个参数是字符串类型。 public <T> T fromJson(String json, Type typeOfT) - pvrforpranavvr

1
我认为问题可能与JSONArray上的toString()有关。但是你是否使用了obj.getAsJsonArray方法?
试试这个:
JSONArray arr = obj.getAsJsonArray("result"); 

            Type listType = new TypeToken<List<Noticia>>() {
            }.getType();
            return new Gson().fromJson(arr , listType);

1

Noticia.java

public class Noticia {
    private String created;
    private String descricao;
    private String id;
    private String image;
    private String titulo;
    private String usuario;
    public String getCreated() {
        return created;
    }
    public void setCreated(String created) {
        this.created = created;
    }
    public String getDescricao() {
        return descricao;
    }
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getImage() {
        return image;
    }
    public void setImage(String image) {
        this.image = image;
    }
    public String getTitulo() {
        return titulo;
    }
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
    public String getUsuario() {
        return usuario;
    }
    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }
    @Override
    public String toString() {
        return "Noticia [created=" + created + ", descricao=" + descricao
                + ", id=" + id + ", image=" + image + ", titulo=" + titulo
                + ", usuario=" + usuario + "]";
    }
}

Result.java

public class Result {
    private Noticia Noticia;

    public Noticia getNoticia() {
        return Noticia;
    }

    public void setNoticia(Noticia noticia) {
        Noticia = noticia;
    }

    @Override
    public String toString() {
        return "Result [Noticia=" + Noticia + "]";
    }

}

Item.java

import java.util.List;

public class Item {
    private List<Result> result;

    public List<Result> getResult() {
        return result;
    }

    public void setResult(List<Result> result) {
        this.result = result;
    }

    @Override
    public String toString() {
        return "Item [result=" + result + "]";
    }
}

Main.java

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.testgson.beans.Item;

public class Main {
    private static Gson gson;

    static {
        gson = new GsonBuilder().create();
    }

    public static void main(String[] args) {
        String j = "{\"result\":[{\"Noticia\":{\"created\":\"2015-08-20 19:58:49\",\"descricao\":\"tttttt\",\"id\":\"19\",\"image\":null,\"titulo\":\"ddddd\",\"usuario\":\"FERNANDO PAIVA\"}},{\"Noticia\":{\"created\":\"2015-08-20 19:59:57\",\"descricao\":\"hhhhhhhh\",\"id\":\"20\",\"image\":\"logo.png\",\"titulo\":\"TITULO DA NOTICIA\",\"usuario\":\"FERNANDO PAIVA\"}}]}";
        Item r = gson.fromJson(j, Item.class);
        System.out.println(r);
    }
}

最终结果。
Item [result=[Result [Noticia=Noticia [created=2015-08-20 19:58:49, descricao=tttttt, id=19, image=null, titulo=ddddd, usuario=FERNANDO PAIVA]], Result [Noticia=Noticia [created=2015-08-20 19:59:57, descricao=hhhhhhhh, id=20, image=logo.png, titulo=TITULO DA NOTICIA, usuario=FERNANDO PAIVA]]]]

0

Kotlin示例:
我们以JSONArry的形式获取响应

call.enqueue(object : Callback<JsonArray> {
        override fun onResponse(call: Call<JsonArray>, response: Response<JsonArray>) {

            val list = response.body().toString()
            val gson = Gson()
            val obj: CitiesList? = gson.fromJson(list, CitiesList::class.java)
            cityLiveData.value = obj!!
           

        }

        override fun onFailure(call: Call<JsonArray>, t: Throwable) {
          
        }

    })

这里的CitiesList CitiesList :: class.java是Cities对象的ArrayList

class CitiesList : ArrayList<CitiesListItem>()

在使用GSON之前,请在Gradle中添加依赖项

dependencies {

implementation 'com.google.code.gson:gson:2.8.8'

}

0
你正在解析看起来像这样的 JSON:
{ "result" : [ 
  { 
        "created" : "2015-08-20 19:58:49",
        "descricao" : "tttttt",
        "id" : "19",
        "image" : null,
        "titulo" : "ddddd",
        "usuario" : "FERNANDO PAIVA"
   },
  { 
        "created" : "2015-08-20 19:59:57",
        "descricao" : "hhhhhhhh",
        "id" : "20",
        "image" : "logo.png",
        "titulo" : "TITULO DA NOTICIA",
        "usuario" : "FERNANDO PAIVA"
      }
] }

你需要创建另一个对象 Item 并解析它们的列表。
public class Item{
    Noticia noticia; 
}

或者您可以遍历JSONArray,从中获取每个字段的“noticia”,然后从给定的JSONObject解析Noticia对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接