Google의 Gson 라이브러리가 Json 문자열을 serialize/deserialize 하는데, 인기있게 사용중인듯 하다.
그중에서 복합적인 Collection 형태의 Json 문자열을 자바객체로 Deserialize 하는 방법을 알아내는데는 두번의 정독이 필요했다.

관련 Document는 다음을 참조하면 된다.
http://sites.google.com/site/gson/gson-user-guide

위의 문서를 읽다 보면 Sample을 이용해서 Gson을 어떻게 사용할것 인지 자세히 설명하고 있다.
그중에서 중간쯤에 위치한  Serializing and Deserializing Collection with Objects of Arbitrary Types
제목으로 사용된 부분이다.
아래와 같은 List<Object>형태의 Collection이 있다고 하자.
[
"hello",
55,
{
"a":"GREETINGS",
"b":"guest"
}
]
처음 0번째는 String, 1번째는 int, 2번째는 Object 형태이다.
첫번째와 두번째 즉 String, int 는 Primitives 형태로 아무런 문제없이 출력이 가능하지만 세번째 사용자생성 object는 그렇지 않아 파싱을 할수가 없어 에러가 나게 된다.

이같은 경우에는 다음과 같이 세가지 옵션중에 하나를 이용해서 처리하라고 되어 있다.
Option 1: Use Gson's parser API (low-level streaming parser or the DOM parser JsonParser) to parse the array elements and then  use Gson.fromJson() on each of the array elements.This is the preferred approach. Here is an example that demonstrates how to do this.

Option 2: Register a type adapter for Collection.class that looks at each of the array members and maps them to appropriate objects. The disadvantage of this approach is that it will screw up deserialization of other collection types in Gson.

Option 3: Register a type adapter for MyCollectionMemberType and use fromJson with Collection<MyCollectionMemberType>
This approach is practical only if the array appears as a top-level element or if you can change the field type holding the collection to be of type Collection<MyCollectionMemberTyep>. 

짧은 영어로 대충 훑어보면 첫번째 방법이 가장 쉽게 해결할수 있을것으로 보인다.
친절하게도 샘플코드까지 제공하고 있다.
샘플 코드를 보면 쉽게 이해가능하다.
1. Domain.java
public class Event { 
    private String name; 
    private String source; 
    private Event(String name, String source) { 
      this.name = name; 
      this.source = source; 
    } 
    @Override 
    public String toString() { 
      return String.format("(name=%s, source=%s)", name, source);  // 바로 이부분이다.
    } 
  } 
 

2. Parsing 하는 샘플코드 부분
Gson gson = new Gson(); 
    Collection collection = new ArrayList(); 
    collection.add("hello"); 
    collection.add(5); 
    collection.add(new Event("GREETINGS", "guest")); 
    String json = gson.toJson(collection); 
    System.out.println("Using Gson.toJson() on a raw collection: " + json); 
    JsonParser parser = new JsonParser(); 
    JsonArray array = parser.parse(json).getAsJsonArray(); 
    String message = gson.fromJson(array.get(0), String.class); 
    int number = gson.fromJson(array.get(1), int.class);  //오류발생하면 int.class 를 Integer.class로 수정한다.
    Event event = gson.fromJson(array.get(2), Event.class); 
    System.out.printf("Using Gson.fromJson() to get: %s, %d, %s", message, number, event);


JsonArray가 제공하는 getAsJsonArray를 이용하는 부분이다.

그럼 여기서 위의 Collection보다 더 복잡한 배열이 포함될경우는 어떻게 될것인가? 궁금해서 테스트 해본다.
 [
"hello",
55,
{
"a":"GREETINGS",
"b":"guest"
},
[
   {"a":"aaaa","b":"First"},
   {"a":"bbbb","b":"Second","c":"third"}
]
]

별것 아닌 응용이지만 그래도 혹시 몰라 테스트 해 보았다.

Type collectionType = new TypeToken<Collection<Event>>(){}.getType();
Collection<Event> eventArray = gson.fromJson(array.get(3), collectionType); 

위와 같이 Collection 을 처리할때의 방법을 이용하여 처리하면 된다.