注册一个解析器就可以,一般只有解析绑定到Object类型才会这样子。
解析器是从ObjectTypeAdapter里面拷贝的代码,做了简单的修改,本来想着集成ObjectTypeAdapter类,但是Gson把这个类标记为final,所以只能做一下修改:
package usermanager; import com.google.gson.TypeAdapter; import com.google.gson.internal.LinkedTreeMap; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; public class TestObjectTypeAdapter extends TypeAdapter<Object> { public TestObjectTypeAdapter() { } @Override public void write(JsonWriter out, Object value) throws IOException { } @Override public Object read(JsonReader in) throws IOException { JsonToken token = in.peek(); switch (token) { case BEGIN_ARRAY: List<Object> list = new ArrayList(); in.beginArray(); while (in.hasNext()) { list.add(this.read(in)); } in.endArray(); return list; case BEGIN_OBJECT: Map<String, Object> map = new LinkedTreeMap(); in.beginObject(); while (in.hasNext()) { map.put(in.nextName(), this.read(in)); } in.endObject(); return map; case STRING: return in.nextString(); case NUMBER: String object = in.nextString(); out(object); if (object.contains(".")){ return Double.valueOf(object); } return Double.valueOf(object).longValue(); case BOOLEAN: return in.nextBoolean(); case NULL: in.nextNull(); return null; default: throw new IllegalStateException(); } } private void out(Object object) { System.out.println(object); } }
修改的代码是:
case NUMBER: String object = in.nextString(); out(object); if (object.contains(".")){ return Double.valueOf(object); } return Double.valueOf(object).longValue();
测试例子:
Map<String, Object> data = null; gson = new GsonBuilder().registerTypeHierarchyAdapter(Object.class, new TestObjectTypeAdapter()).create(); data = gson.fromJson("{\"data\":200,\"list\":[{\"id\":1,\"name\":\"001\"},{\"id\":2,\"name\":\"002\"},{\"id\":3,\"name\":\"003\"}]}\n", Map.class); out(data);
解析出来:
{
“data”:200,
“list”:[
{
“id”:1,
“name”:“001”
},
{
“id”:2,
“name”:“002”
},
{
“id”:3,
“name”:“003”
}
]
}