在android中使用GSONparsing带有dynamic“键”和“值”的JSON
我目前正在一个Android项目,需要我调用一个Web服务,将返回一个JSON文件。 我一直在使用GSON库来parsing所有的json文件,并得到一个JSON对象。 直到我遇到这个关键字段是dynamic的json数据,它一直运行良好。 这个文件的一个例子如下:
{ "0": { "count":"5"}, "1": { "title":"...", "desc":"" }, "2": { "title":"...", "desc":"" }, "3": { "title":"...", "desc":"" }, "4": { "title":"...", "desc":"" }, "5": { "title":"...", "desc":"" }, "routes": { "route1":"...", "route3":"" }, }
我能够得到基于密钥ID为“0”的计数,但我不知道如何利用这个值来获得其他的关键对象(密钥ID 1-5),其中包括数据我需要。 如果有人能够帮助我解决这个问题,我将非常感激。 谢谢。
我能想到的最直接的方法就是将结构视为Map
( Map
)。
使用Gson,这样做相对容易,只要Map
结构是静态的,根的每个分支都具有相同的深度,并且所有东西都是一个String
。
import java.io.FileReader; import java.lang.reflect.Type; import java.util.Map; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; public class GsonFoo { public static void main(String[] args) throws Exception { Gson gson = new Gson(); Type mapType = new TypeToken<Map<String,Map<String, String>>>() {}.getType(); Map<String,Map<String, String>> map = gson.fromJson(new FileReader("input.json"), mapType); System.out.println(map); // Get the count... int count = Integer.parseInt(map.get("0").get("count")); // Get each numbered entry... for (int i = 1; i <= count; i++) { System.out.println("Entry " + i + ":"); Map<String, String> numberedEntry = map.get(String.valueOf(i)); for (String key : numberedEntry.keySet()) System.out.printf("key=%s, value=%s\n", key, numberedEntry.get(key)); } // Get the routes... Map<String, String> routes = map.get("routes"); // Get each route... System.out.println("Routes:"); for (String key : routes.keySet()) System.out.printf("key=%s, value=%s\n", key, routes.get(key)); } }
对于更dynamic的Map
结构处理,我强烈build议切换到使用Jackson而不是Gson,因为Jackson只会用一行简单的代码将任何任意复杂的JSON对象反序列化为Java Map
,并且会自动保留types原始价值观。
import java.io.File; import java.util.Map; import org.codehaus.jackson.map.ObjectMapper; public class JacksonFoo { public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); Map map = mapper.readValue(new File("input.json"), Map.class); System.out.println(map); } }
Gson也可以做到这一点,但是需要几十行代码。 (另外,Gson还有其他的缺点,让jackson很值得。)
您可以使用计数来获取单个关键对象。 所以你会得到对象“1”,然后得到它的“标题”和“desc”对象,然后对象“2”等