我目前正在开发一个Android项目,该项目需要我调用网络服务,该服务将返回一个json文件。我一直在使用GSON库来解析所有json文件并获取一个JSON对象。在我遇到关键字段是动态的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(of Map)。
Map
使用Gson,这是相对容易做到的,只要Map结构是静态已知的,则从根开始的每个分支都具有相同的深度,并且一切都是a String。
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)); } }
对于更多的动态Map结构处理,我强烈建议切换为使用Jackson,而不是Gson,因为Jackson Map只需一行简单的代码即可将任何任意复杂度的JSON对象反序列化为Java ,并且会自动保留原始类型价值观。
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。)