2016-09-21 3 views
0

У меня возникли проблемы с разбором общего ArrayList с GSON. Я подтвердил, что этот метод работает, если указан конкретный тип для ArrayList (без каких-либо дженериков), но я бы хотел написать метод, который работает с generics.Разбор общего массива ArrayList с использованием GSON

Основываясь на других вопросах переполнения стека, это должно работать, и я не могу понять, почему это не так. Он не разбирает ArrayList, поэтому я получаю коллекцию LinkedTreeMap. Общий метод ниже:

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

Редактировать:data это просто Object, который содержит JSON, чтобы быть разобраны. Инструкция gsonParser.toJson(data) работает просто отлично.

И я звоню это так, где MyClass может быть любой пользовательский класс Java я написал:

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

Любая помощь будет оценена, я не знаю, в чем проблема, но это связано с шаблонами точно, поскольку не общий метод будет выполнять эту работу.

Edit2: Просто чтобы прояснить, я также в том числе метод не генериков, которые работали:

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

ответ

0

Когда я устанавливаю данные в 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> 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); 
    } 
} 

Вы также не должны передавать параметр Class<T> classOfT. Определите подпись, как этот

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

Здравствуйте, извините за долгое время без ответа, но я очень занят в эти дни. Я использую gson версии 1.19, управляемый из maven. Мне нужно продолжать использовать эту версию. Попробуйте определить пользовательский класс с некоторыми атрибутами и протестировать метод с ним, он не работает для меня. Это сообщение было оригинально предназначено для android, но протестировало метод в Java, и все, что я получаю, это LinkedHashMap в результате процесса синтаксического анализа ... не могу понять, почему – JorgeGRC

Смежные вопросы