用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。

通常有三件事情需要考虑选择任何图书馆:

  1. 性能
  2. 易于使用(代码编写简单,易于阅读) – 符合功能。
  3. 对于移动应用程序:依赖/ 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所以在你不确定值是否存在的情况下,使用optStringoptIntoptBoolean等等,缺省值,如果它不存在,甚至尝试将值转换为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
  • 将一个数组列表项转换为多个项目