使用GSON解析泛型ArrayList [英] Parsing generic ArrayList using GSON

查看:210
本文介绍了使用GSON解析泛型ArrayList的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在使用GSON解析通用 ArrayList 时遇到了一些麻烦。我已经确认,如果指定了 ArrayList 的特定类型(不使用泛型),该方法就可以工作,但我想编写一种可以与泛型一起使用的方法。

基于其他堆栈溢出的问题,这应该起作用,我不明白为什么它不会。它无法解析 ArrayList ,所以我得到的是 LinkedTreeMap 的集合。通用方法如下:

  public< T>列表与LT; T> listFromJson(@NonNull Class< T> classOfT)抛出JsonSyntaxException {
if(data == null)
return null;
Gson gsonParser = new Gson();
TypeToken< ArrayList< T>> token = new TypeToken< ArrayList< T>>(){};
返回gsonParser.fromJson(gsonParser.toJson(data),token.getType());
}

编辑:> data 只是一个 Object ,它包含要解析的json。指令 gsonParser.toJson(data)可以正常工作。



我这样称呼它, MyClass 可能是我写的任何自定义java类:

  List< ; MyClass的> resList = result.listFromJson(MyClass.class); 

任何帮助我都会感激,我真的不知道问题是什么,但它与模板肯定,作为一个非泛型方法可以完成这项工作。



Edit2:为了澄清,我还包括非泛型方法:

  public List< MyClass> listFromJson()抛出JsonSyntaxException {
类型listType = new TypeToken< ArrayList< MyClass>>(){}。getType();
Gson gsonParser = new Gson();
return gsonParser.fromJson(gsonParser.toJson(data),listType);


解决方案

String [] 那么你的两个实现都适合我。
您是否使用相同的进口?
我正在使用这个gson版本'com.google.code.gson:gson:2.7'

  import static org.junit.Assert。*; 

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;

public class SomeTest {

private String [] data = {Hello};

public< T>列表与LT; T> listFromJson(Class< T> classOfT)抛出JsonSyntaxException {
if(data == null)
return null;
Gson gsonParser = new Gson();
TypeToken< ArrayList< T>> token = new TypeToken< ArrayList< T>>(){};
返回gsonParser.fromJson(gsonParser.toJson(data),token.getType());
}

public List< String> listFromJson()抛出JsonSyntaxException {
类型listType = new TypeToken< ArrayList< String>>(){}。getType();
Gson gsonParser = new Gson();
return gsonParser.fromJson(gsonParser.toJson(data),listType);
}

@Test
public void parsingGenericArrayListUsingGSON_0(){
List< String> actual = listFromJson(String.class);
列表< String> expected = new ArrayList<>();
expected.add(Hello);
assertEquals(预期的,实际的);
}

@Test
public void parsingGenericArrayListUsingGSON_1(){
List< String> actual = listFromJson();
列表< String> expected = new ArrayList<>();
expected.add(Hello);
assertEquals(预期的,实际的);


code $
$ b你也不必通过类< T> classOfT 参数。
定义这样的签名

  public< T>列表与LT; T> listFromJson()抛出JsonSyntaxException 


I'm having some trouble parsing a generic ArrayList with GSON. I've confirmed that this method works if the specific type for the ArrayList is specified (using no generics), but I'd like to write a method which works with generics.

Based on other stack overflow's questions, this should work, and I can't really understand why it doesn't. It fails to parse the ArrayList so all I get is a collection of LinkedTreeMap. The generic method is below:

public <T> List<T> listFromJson(@NonNull Class<T> classOfT ) throws JsonSyntaxException {
    if (data == null)
        return null;
    Gson gsonParser = new Gson();
    TypeToken<ArrayList<T>> token = new TypeToken<ArrayList<T>>() {};
    return gsonParser.fromJson(gsonParser.toJson(data), token.getType());
}

Edit: datais just an Objectwhich contains the json to be parsed. The instruction gsonParser.toJson(data) works just fine.

And I'm calling it like this, where MyClass might be any custom java class I've written:

List<MyClass> resList = result.listFromJson(MyClass.class);

Any help would be appreciated, I don't really know what the problem is but it's related with the templates for sure, as a non generic method would do the work.

Edit2: Just to clarify, I'm also including the non generics method which worked:

public  List<MyClass> listFromJson() throws JsonSyntaxException {
        Type listType = new TypeToken<ArrayList<MyClass>>(){}.getType();
        Gson gsonParser = new Gson();
        return gsonParser.fromJson(gsonParser.toJson(data), listType);
   }

解决方案

When I set data to a String[] then both of your implementations work for me. Are you using the same imports? I am using this gson version 'com.google.code.gson:gson:2.7'

import static org.junit.Assert.*;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;

public class SomeTest {

  private String[] data = { "Hello" };

  public <T> List<T> listFromJson(Class<T> classOfT) throws JsonSyntaxException {
    if (data == null)
      return null;
    Gson gsonParser = new Gson();
    TypeToken<ArrayList<T>> token = new TypeToken<ArrayList<T>>() {};
    return gsonParser.fromJson(gsonParser.toJson(data), token.getType());
  }

  public List<String> listFromJson() throws JsonSyntaxException {
    Type listType = new TypeToken<ArrayList<String>>(){}.getType();
    Gson gsonParser = new Gson();
    return gsonParser.fromJson(gsonParser.toJson(data), listType);
}

  @Test
  public void parsingGenericArrayListUsingGSON_0() {
    List<String> actual = listFromJson(String.class);
    List<String> expected = new ArrayList<>();
    expected.add("Hello");
    assertEquals(expected, actual);
  }

  @Test
  public void parsingGenericArrayListUsingGSON_1() {
    List<String> actual = listFromJson();
    List<String> expected = new ArrayList<>();
    expected.add("Hello");
    assertEquals(expected, actual);
  }
}

You also do not have to pass the Class<T> classOfT parameter. Define the signature like this

 public <T> List<T> listFromJson() throws JsonSyntaxException

这篇关于使用GSON解析泛型ArrayList的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆