【问题标题】:how to iterate through json objects in java如何在java中遍历json对象
【发布时间】:2015-02-27 11:42:31
【问题描述】:

我正在尝试遍历我的 json 文件并获取所需的详细信息 这是我的 json

{
"000": {
    "component": "c",
    "determinantType": "dt",
    "determinant": "d",
    "header": "h",
    "determinantvalue": "null"
},
"001": {
    "component": "t",
    "determinantType": "i",
    "determinant":"ld",
    "header": "D",
    "determinantvalue": "null"
},
"002": {
    "component": "x",
    "determinantType": "id",
    "determinant": "pld",
    "header": "P",
    "determinantValue": "null"
}}

我的java代码

FileReader file = new FileReader("test.json");
Object obj = parser.parse(file);
System.out.println(obj);
JSONObject jsonObject = (JSONObject) obj;            
JSONArray msg = (JSONArray) jsonObject.get(key);          
Iterator<String> iterator = msg.iterator();         
while (iterator.hasNext()) {
System.out.println(iterator.next());            
String component = (String) jsonObject.get("component");           
System.out.println("component: " + component);           

正如您在代码中看到的那样,我正在导入我的 json 文件并尝试从中获取下一个元素并打印组件,我还应该打印标题、行列式和行列式值 谢谢

【问题讨论】:

  • 您遇到错误了吗?这段代码有什么问题?
  • 据我所知,您没有任何 json 数组 - 我们不知道 key 是什么。
  • JSONArray msg = (JSONArray) jsonObject.get(key); “我在这里尝试获取所有密钥,即'000','001','002'”以便我可以使用它进行迭代,但我无法获取密钥
  • @user3724559 您的文件中没有 JSONArray。只有一个对象具有多个具有多个属性的对象。
  • @user3724559:我是说你不应该使用 JSONArray,因为你的 JSON 中没有任何数组。这与说您无法迭代以获取所有元素不同 - 请参阅我的答案。

标签: java json


【解决方案1】:

试试这个...

FileReader file = new FileReader("test.json");
Object obj = parser.parse(file);
System.out.println(obj);
JSONObject jsonObject = (JSONObject) obj;            

Iterator<String> iterator = jsonObject .iterator();  

for(Iterator iterator = jsonObject.keySet().iterator(); iterator.hasNext();) {
    String key = (String) iterator.next();
    System.out.println(jsonObject.get(key));
}

【讨论】:

  • JSON 中 没有 JSON 数组 - 所以转换会失败。
  • @dhaval 我已经试过了,它不会解决问题,它只得到键和值将为空
  • 现在你尝试在JSONObject 上调用iterator(),它没有这样的方法...
【解决方案2】:

您没有数组 - 您有 properties 名称为“000”等。数组如下所示:

"array": [ {
    "foo": "bar1",
    "baz": "qux1"
  }, {
    "foo": "bar2",
    "baz": "qux2"
  }
]

注意[ ... ] - 这表示 JSON 数组。

您可以使用keys() 遍历JSONObject 的属性:

// Unfortunately keys() just returns a raw Iterator...
Iterator keys = jsonObject.keys();
while (keys.hasNext()) {
    Object key = keys.next();
    JSONObject value = jsonObject.getJSONObject((String) key);
    String component = value.getString("component");
    System.out.println(component);
}

或者:

@SuppressWarnings("unchecked")
Iterator<String> keys = (Iterator<String>) jsonObject.keys();
while (keys.hasNext()) {
    String key = keys.next();
    JSONObject value = jsonObject.getJSONObject(key);
    String component = value.getString("component");
    System.out.println(component);
}

【讨论】:

  • 谢谢,我会把我的 json 文件变成一个 json 数组并尝试迭代
  • @user3724559:如果您可以更改文件的格式,那将是理想的选择。但如果不是,我的回答应该显示你如何迭代......
  • 我使用了keyset并进行了迭代,但它是无序的,无论如何我可以对其进行排序吗?如您所见,我将 JSON 设为 000,001,002,以便我可以订购我的 json
  • @user3724559:你可以从键中创建一个List&lt;String&gt;,然后在获取它们之前调用Collections.sort...
  • 我们无法将集合转换为列表
【解决方案3】:

没有JSONArray,只有几个JSONObjects。用JSONObject.keys() 迭代主JSONObject 的键。

public static final String COMPONENT = "component";
public static final String DT = "determinantType";
public static final String D = "determinant": "d";
public static final String HEADER = "header";
public static final String DV = "determinantvalue";

JSONObject jso = getItFromSomewhere();
for (Object key : jso.keys()) {
    JSONObject subset = jso.getJSONObject(key);
    String d = subset.getString(D);
    String header = subset.getString(HEADER);
    String dv = subset.getString(DV);
    System.out.println(key + " " + header + " " + d + " " + dv);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    相关资源
    最近更新 更多