用Java解析JSON对象
我有JSON对象如下:
member = "{interests : [{interestKey:Dogs}, {interestKey:Cats}]}";
在Java中我想解析上面的jsonobject并将值存储在一个数组列表中。
任何人都可以给我提供一些代码片段,通过我可以实现这一点。
谢谢
我假设你想把interestKeys存储在一个列表中。
使用org.json库:
JSONObject obj = new JSONObject("{interests : [{interestKey:Dogs}, {interestKey:Cats}]}"); List<String> list = new ArrayList<String>(); JSONArray array = obj.getJSONArray("interests"); for(int i = 0 ; i < array.length() ; i++){ list.add(array.getJSONObject(i).getString("interestKey")); }
public class JsonParsing { public static Properties properties = null; public static JSONObject jsonObject = null; static { properties = new Properties(); } public static void main(String[] args) { try { JSONParser jsonParser = new JSONParser(); File file = new File("src/main/java/read.json"); Object object = jsonParser.parse(new FileReader(file)); jsonObject = (JSONObject) object; parseJson(jsonObject); } catch (Exception ex) { ex.printStackTrace(); } } public static void getArray(Object object2) throws ParseException { JSONArray jsonArr = (JSONArray) object2; for (int k = 0; k < jsonArr.size(); k++) { if (jsonArr.get(k) instanceof JSONObject) { parseJson((JSONObject) jsonArr.get(k)); } else { System.out.println(jsonArr.get(k)); } } } public static void parseJson(JSONObject jsonObject) throws ParseException { Set<Object> set = jsonObject.keySet(); Iterator<Object> iterator = set.iterator(); while (iterator.hasNext()) { Object obj = iterator.next(); if (jsonObject.get(obj) instanceof JSONArray) { System.out.println(obj.toString()); getArray(jsonObject.get(obj)); } else { if (jsonObject.get(obj) instanceof JSONObject) { parseJson((JSONObject) jsonObject.get(obj)); } else { System.out.println(obj.toString() + "\t" + jsonObject.get(obj)); } } } }}
谢谢soooooooo很多代码我可以阅读任何JSON文件感谢您的代码:)现在,我试图按级别组织所有的元素,因为可以使用它们!
我正在使用Android从一个URL读取一个JSON,唯一的我不得不改变线
Set<Object> set = jsonObject.keySet(); Iterator<Object> iterator = set.iterator();
对于
Iterator<?> iterator = jsonObject.keys();
我分享我的实施,帮助某人:
public void parseJson(JSONObject jsonObject) throws ParseException, JSONException { Iterator<?> iterator = jsonObject.keys(); while (iterator.hasNext()) { String obj = iterator.next().toString(); if (jsonObject.get(obj) instanceof JSONArray) { //Toast.makeText(MainActivity.this, "Objeto: JSONArray", Toast.LENGTH_SHORT).show(); //System.out.println(obj.toString()); TextView txtView = new TextView(this); txtView.setText(obj.toString()); layoutIzq.addView(txtView); getArray(jsonObject.get(obj)); } else { if (jsonObject.get(obj) instanceof JSONObject) { //Toast.makeText(MainActivity.this, "Objeto: JSONObject", Toast.LENGTH_SHORT).show(); parseJson((JSONObject) jsonObject.get(obj)); } else { //Toast.makeText(MainActivity.this, "Objeto: Value", Toast.LENGTH_SHORT).show(); //System.out.println(obj.toString() + "\t"+ jsonObject.get(obj)); TextView txtView = new TextView(this); txtView.setText(obj.toString() + "\t"+ jsonObject.get(obj)); layoutIzq.addView(txtView); } } } }
Java中有许多JSON库可用。
最臭名昭着的是Jackson,GSON,Genson,FastJson和org.json。
通常有三件事情需要考虑选择任何图书馆:
- 性能
- 易于使用(代码编写简单,易于阅读) – 符合功能。
- 对于移动应用程序:依赖/ jar大小
特别是对于JSON库(以及任何序列化/反序列化库),数据绑定通常也是有趣的,因为它不需要编写样板代码来打包/解包数据。
对于1,看到这个基准: https : //github.com/fabienrenaud/java-json-benchmark我使用JMH比较(杰克逊,gson,genson,fastjson,org.json,jsonp)性能的串行器和反串行器使用流和数据绑定API。 2,你可以在互联网上找到很多例子。 上面的基准也可以作为例子的来源…
基准测试: 杰克逊比org.json好5到6倍,比GSON好两倍。
对于您的特定示例,以下代码使用jackson解码您的json:
public class MyObj { private List<Interest> interests; static final class Interest { private String interestKey; } private static final ObjectMapper MAPPER = new ObjectMapper(); public static void main(String[] args) throws IOException { MyObj o = JACKSON.readValue("{\"interests\": [{\"interestKey\": \"Dogs\"}, {\"interestKey\": \"Cats\" }]}", MyObj.class); } }
如果您有任何问题,请告诉我。
1.)创建适当类型的ArrayList,在这种情况下即String
2.)创建一个JSONObject
同时将字符串传递给JSONObject
构造函数作为输入
- 由于
JSONObject
表示法由大括号表示, -
JSONArray
表示法由方括号表示,即[]
3.)使用"interests"
作为索引从JSONObject
JSONArray
(在第二步中创建)。
4.)使用length()
函数提供的数组长度来遍历JASONArray
5.)使用getJSONObject(index)
函数从JSONArray
检索您的JSONObjects
6.)使用索引'“interestKey”'从JSONObject
获取数据。
注意:如果json响应(通常来自其他JSON响应API)包含像这样的引号( "
),则JSON
解析使用特殊嵌套字符的转义序列
`"{"key":"value"}"`
应该是这样的
`"{\"key\":\"value\"}"`
所以你可以使用JSONParser
来实现转义序列格式的安全性
JSONParser parser = new JSONParser(); JSONObject json = (JSONObject) parser.parse(inputString);
代码:
JSONParser parser = new JSONParser(); String response = "{interests : [{interestKey:Dogs}, {interestKey:Cats}]}"; JSONObject jsonObj = (JSONObject) parser.parse(response);
要么
JSONObject jsonObj = new JSONObject("{interests : [{interestKey:Dogs}, {interestKey:Cats}]}");
List<String> interestList = new ArrayList<String>(); JSONArray jsonArray = jsonObj.getJSONArray("interests"); for(int i = 0 ; i < jsonArray.length() ; i++){ interestList.add(jsonArray.getJSONObject(i).optString("interestKey")); }
注意:有些时候你可能会看到一些异常,当这些values are not available in appropriate type or is there is no mapping key
所以在你不确定值是否存在的情况下,使用optString
, optInt
, optBoolean
等等,缺省值,如果它不存在,甚至尝试将值转换为int,如果它是字符串类型,反之亦然如此简单没有空或NumberFormat例外在所有情况下缺少键或值
从文档
获取与密钥关联的可选字符串。 如果没有这个键,它将返回defaultValue。
public String optString(String key, String defaultValue) {
String missingKeyValue = json_data.optString("status","N/A"); // note there is no such key as "status" in response // will return "N/A" if no key found
或者为了得到空字符串,即""
如果没有找到密钥,那么只需使用
String missingKeyValue = json_data.optString("status"); // will return "" if no key found where "" is an empty string
进一步参考学习
- 如何将字符串转换为Java中的JSONObject
- 将一个数组列表项转换为多个项目