3 回答

TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊
您需要使用類型標(biāo)記來處理泛型情況,因?yàn)轭愋托畔?code>T被 Java 編譯器刪除,Gson 不知道要恢復(fù)T
到什么類型。
Type typeToken = new TypeToken<ResponseTo<Item>>() { }.getType(); ResponseTo<Item> responseTo = stringToObject( <json-string>, typeToken );

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
如果您在對象中有類型鑒別器(即每個(gè)示例中具有唯一值的公共字段),那么 Jackson@JsonTypeInfo(JsonTypeInfo.As.EXISTING_PROPERTY...)
將允許您定義查找位置,并且初始化可以預(yù)先注冊所有可能的類ObjectMapper.registerSubtypes(Item.class)
。然后杰克遜會(huì)選擇正確的那個(gè)。
如果要實(shí)例化哪種類型的規(guī)則比“在字段 X 中查找”更復(fù)雜,那么您必須編寫自己的規(guī)則@JsonTypeResolver
來實(shí)現(xiàn)所述邏輯(非平凡)。

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
格森
您可以使用內(nèi)部com.google.gson.internal.$Gson$Types類來實(shí)現(xiàn)這一點(diǎn):
import com.google.gson.Gson;
import com.google.gson.internal.$Gson$Types;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;
public class GsonApp {
public static void main(String[] args) {
String json = "{\n" +
" \"totalsize\": 5,\n" +
" \"data\": [\n" +
" {\n" +
" \"name\": 1\n" +
" },\n" +
" {\n" +
" \"name\": 2\n" +
" }\n" +
" ]\n" +
"}\n";
System.out.println(stringToObject(json, Item.class));
}
static <T> ResponseTo<T> stringToObject(String jsonString, Class<T> clazz) {
final Gson gson = new Gson();
// do some typeadapter function magic
ParameterizedType parameterizedType = $Gson$Types.newParameterizedTypeWithOwner(ResponseTo.class, ResponseTo.class, clazz);
return gson.fromJson(jsonString, parameterizedType);
}
}
class ResponseTo<T> {
public Long totalsize = null;
public final List<T> data = new ArrayList<>();
@Override
public String toString() {
return "ResponseTo{" +
"totalsize=" + totalsize +
", data=" + data +
'}';
}
}
class Item {
public int name;
@Override
public String toString() {
return "Item{" +
"name=" + name +
'}';
}
}
上面的代碼打?。?/p>
ResponseTo{totalsize=5, data=[Item{name=1}, Item{name=2}]}
杰克遜
在Jackson你可以做類似的方法:
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class JsonApp {
public static void main(String[] args) throws Exception {
String json = "{\n" +
" \"totalsize\": 5,\n" +
" \"data\": [\n" +
" {\n" +
" \"name\": 1\n" +
" },\n" +
" {\n" +
" \"name\": 2\n" +
" }\n" +
" ]\n" +
"}\n";
System.out.println(stringToObject(json, Item.class));
}
static <T> ResponseTo<T> stringToObject(String jsonString, Class<T> clazz) throws IOException {
ObjectMapper mapper = new ObjectMapper();
// do some typeadapter function magic
JavaType responseType = mapper.getTypeFactory().constructParametricType(ResponseTo.class, clazz);
return mapper.readValue(jsonString, responseType);
}
}
添加回答
舉報(bào)