从json文件获取动态键和值

时间:2018-09-18 13:09:37

标签: java json

我有包含动态部分和静态部分的json文件,我的问题出在动态部分,因为我无法获取密钥,所以我更改为创建一个Java类来获取密钥。

我的文件是这样的:

[
{
    "data": {
        "1801": "1801_13",
        "293954": "293954_1",
        "293985": "noir",
        "294071": "294071_3",
        "ean":  "5035915032563",
         "Nature": "450"            
    },

    "creation_date": "2018-08-28T12:25:06.638Z",
    "update_date": "2018-08-28T12:32:55.640Z",
   },

 {
    "data": {
        "2633": "1801_13",
        "293954": "293954_1",
        "ean":  "5035236232070",
        "Nature": "301"             
    },

    "creation_date": "2018-08-28T12:25:06.638Z",
    "update_date": "2018-08-28T12:32:55.640Z",
   }  ]

data:动态部分,在这一部分中,我有两个静态键(ena和nature),其余的键都是动态的,例如本例。

我创建了这个java类:

    package routines;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.simple.JSONObject;
import org.json.simple.parser.*;

public class getKeyFromFile {




        public static void main(String filepath) throws ParseException, JSONException {
            JSONParser parser = new JSONParser();

            try {
        Object obj = parser.parse(new FileReader( filepath));
        JSONObject jsonObject = (JSONObject)obj ;


            printJSON((JSONObject) jsonObject);
            } catch (FileNotFoundException e) {

            } catch (IOException ioe) {

            }       
        }
            public static void printJSON(JSONObject jsonObj) {
                for (Object keyObj : jsonObj.keySet()) {
                    String key = (String)keyObj;
                    Object valObj = jsonObj.get(key);
                    if (valObj instanceof JSONObject) {
                        // call printJSON on nested object
                        printJSON((JSONObject) valObj);
                    } else {
                        // print key-value pair
                        System.out.println("key : "+key);
                        System.out.println("value : "+valObj.toString());
                    }
                }
            }}

我收到此错误:

  

java.lang.ClassCastException:不能强制转换org.json.simple.JSONArray   到org.json.JSONArray

2 个答案:

答案 0 :(得分:0)

事物,首先,您的json格式错误。在两个元素的下一行末尾删除逗号。

"update_date": "2018-08-28T12:32:55.640Z",

第二,对象是一个数组,如错误消息中所示。因此,将您的代码更改为使用JSONArray而不是JSONObject

JSONArray jsonArray = (JSONArray) obj;

从那里,您必须修改打印功能以使用JSONArray,并使用其他for循环遍历该循环。像这样的东西

for (Object json : jsonArray) {
    printJSONOBject((JSONObject) json)
}

private void printJSONOBject(JSONObject jsonObject) {
    for (Object keyObj : jsonObject.keySet()) {
        String key = (String) keyObj;
        Object valObj = jsonObject.get(key);
        if (valObj instanceof JSONObject) {
            printJSONOBject((JSONObject) valObj);
        } else {
            System.out.println(key + " : " + valObj);
        }
    }
}

答案 1 :(得分:0)

谢谢techtabu :) 此代码运行,但它复制了所有我的文件。 我不想在结果中看到对象数据。 我想要:

document.querySelector("a").click();

第二行:

1801  : 1801_13,
    293954: 293954_1,
    293985: noir,
    294071: 294071_3,
    ean   :  5035915032563,
    Nature: 450  ,
    creation_date: 2018-08-28T12:25:06.638Z,
    update_date: 2018-08-28T12:32:55.640Z