- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
String response = HttpLoader.loadString(params[0]);
Gson gson = new GsonBuilder().registerTypeAdapter(ArrayList.class,
new JsonCollectionSerializer<ArrayList<MyClass>>()).
create();
ArrayList<MyClass> items_generic = new ArrayList<MyClass>() { };
ArrayList<MyClass> items = gson.fromJson(response, items_generic.getClass().getGenericSuperclass());
return items;
public class JsonCollectionSerializer<E> implements
JsonSerializer<Collection<E>>, JsonDeserializer<Collection<E>> {
@SuppressWarnings("unchecked")
public Collection<E> deserialize(JsonElement element, Type type,
JsonDeserializationContext context) throws JsonParseException {
JsonArray items = element.getAsJsonArray();
ParameterizedType deserializationCollectionType = ((ParameterizedType) type);
Type collectionItemType = deserializationCollectionType.getActualTypeArguments()[0];
Collection<E> list = null;
try {
list = (Collection<E>) ((Class<?>) deserializationCollectionType.getRawType()).newInstance();
for (JsonElement e : items) {
list.add((E) context.deserialize(e, collectionItemType));
}
} catch (InstantiationException e) {
throw new JsonParseException(e);
} catch (IllegalAccessException e) {
throw new JsonParseException(e);
}
return list;
}
}
someone 23.01.2014 15:07 # +1
Кстати, использовать переменные конкретных типов коллекций - плохой стиль.
kegdan 23.01.2014 15:13 # 0
someone 23.01.2014 15:50 # 0
kegdan 23.01.2014 15:52 # 0
предпочтительно сохранять коллекцию object нежели MyClass?
почему?
roman-kashitsyn 23.01.2014 15:57 # +2
kegdan 23.01.2014 15:59 # 0
roman-kashitsyn 23.01.2014 16:05 # +3
Для шарпеев:
List = IList
ArrayList = List
kegdan 23.01.2014 16:07 # 0
Но почему?
roman-kashitsyn 23.01.2014 16:18 # +1
kegdan 23.01.2014 16:37 # +1
roman-kashitsyn 23.01.2014 16:41 # 0
kegdan 23.01.2014 16:50 # 0
Да, за O(n), но из IEnumerable<> можно любую коллекцию инициализировать. Тем белее скорее всего нужна будет обработка линком, а он все равно в IEnumerable<> переводит
guest 24.01.2014 10:54 # 0
Нет.
Сперва проверяется тип, и если у него есть свойство Length или Count, то возвращается оно. И лишь если ничего такого нет, то происходит пробег по коллекции.
bormand 23.01.2014 16:56 # +1
Не всегда...
Имхо, оптимальный вариант - самый минималистичный интерфейс из тех, которые позволят адекватно решить задачу.
Т.е. если функции нужен произвольный доступ к элементам - не надо закастовывать List по самый IEnumerable, а потом внутри функции создавать временный список через ToList(). Лучше сразу передать IList.
kegdan 23.01.2014 17:05 # +1
я так и понял.
myzone 26.01.2014 02:56 # 0
2) Не всегда, бывают, случаи, когда тебе важено иметь именно конкретный тип
wvxvw 23.01.2014 21:20 # 0
Я как для себя это открыл, прям чуть не зарыдал от счастья.
+ Да, Джексон лучше Г.сона. Как там в плане скорости - хз. но по крайней мере своего говнокода к уже имеющемуся не нужно так много добавлять.
bormand 23.01.2014 21:24 # +2
7, там же и няшный try-with-resource появился.
anonimb84a2f6fd141 23.01.2014 23:30 # +1
TarasB 24.01.2014 10:56 # +3
anonimb84a2f6fd141 26.01.2014 16:16 # 0
TarasB 26.01.2014 17:05 # 0
anonimb84a2f6fd141 23.01.2014 23:31 # 0