在不知道密钥的情况下解析json

时间:2014-09-05 07:46:26

标签: java android json

我试图在不知道json格式的键和结构的情况下解析java中的json并将该数据保存到hashmap中

如何循环遍历整个json格式并将键和值存储到hashmap

 {"id" : 12345, "value" : "123", "person" : "1"}

就像在这个例子中一样,所有的键都是jsonobject,它们都不是json数组

还有其他像杰克逊这样的图书馆,我不想使用任何第三方图书馆

4 个答案:

答案 0 :(得分:4)

这只是一个例子。 对于JSON Like

{
 "status": "OK",
 "search_result": [

            {
                "product": "abc",
                "id": "1132",
                "question_mark": {
                    "141": {
                        "count": "141",
                        "more_description": "this is abc",
                        "seq": "2"
                    },
                    "8911": {
                        "count": "8911",
                        "more_desc": "this is cup",
                        "seq": "1"
                    }
                },
                "name": "some name",
                "description": "This is some product"
            },
            {
                "product": "XYZ",
                "id": "1129",
                "question_mark": {
                    "379": {
                        "count": "379",
                        "more_desc": "this is xyz",
                        "seq": "5"
                    },
                    "845": {
                        "count": "845",
                        "more_desc": "this is table",
                        "seq": "6"
                    },
                    "12383": {
                        "count": "12383",
                        "more_desc": "Jumbo",
                        "seq": "4"
                    },
                    "257258": {
                        "count": "257258",
                        "more_desc": "large",
                        "seq": "1"
                    }
                },
                "name": "some other name",
                "description": "this is some other product"
            }
       ]
}

使用JSONObject keys()获取密钥,然后迭代每个密钥以获得动态值。

代码大致如下:

// searchResult refers to the current element in the array "search_result"
JSONObject questionMark = searchResult.getJSONObject("question_mark");
Iterator keys = questionMark.keys();

while(keys.hasNext()) {
    // loop to get the dynamic key
    String currentDynamicKey = (String)keys.next();

    // get the value of the dynamic key
    JSONObject currentDynamicValue = questionMark.getJSONObject(currentDynamicKey);

    // do something here with the value...
}

尝试此代码

public void parse(String json)  {
   JsonFactory factory = new JsonFactory();

   ObjectMapper mapper = new ObjectMapper(factory);
   JsonNode rootNode = mapper.readTree(json);  

   Iterator<Map.Entry<String,JsonNode>> fieldsIterator = rootNode.fields();
   while (fieldsIterator.hasNext()) {

       Map.Entry<String,JsonNode> field = fieldsIterator.next();
       System.out.println("Key:"field.getKey() + "\tValue:" + field.getValue());
   }

}

还要看一下这个链接

https://github.com/alibaba/fastjson

答案 1 :(得分:2)

可能的解决方案:

private HashMap<String, Object> getHashMapFromJson(String json) throws JSONException {
    HashMap<String, Object> map = new HashMap<String, Object>();
    JSONObject jsonObject = new JSONObject(json);
    for (Iterator<String> it = jsonObject.keys(); it.hasNext();) {
        String key = it.next();
        map.put(key, jsonObject.get(key));
    }
    return map;
}

使用示例JSON字符串进行测试:

private void test() {
    String json = " {\"id\" : 12345, \"value\" : \"123\", \"person\" : \"1\"}";
    try {
        HashMap<String, Object> map = getHashMapFromJson(json);
        for (String key : map.keySet()) {
            Log.i("JsonTest", key + ": " + map.get(key));
        }
    } catch (JSONException e) {
        Log.e("JsonTest", "Failed parsing " + json, e);
    }

}

输出:

I/JsonTest(24833): id: 12345
I/JsonTest(24833): value: 123
I/JsonTest(24833): person: 1

注意:这不太理想,我只是快速写下来。

答案 2 :(得分:0)

quick-json parser

怎么样?
 JsonParserFactory factory=JsonParserFactory.getInstance();
 JsonParser parser=factory.newJsonParser();
 Map jsonData=parser.parseJson(inputJsonString);

答案 3 :(得分:-1)

// add this in your android App module

    compile 'com.fasterxml.jackson.core:jackson-core:2.5.3'
    compile 'com.fasterxml.jackson.core:jackson-annotations:2.5.3'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.5.3'
android {
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LGPL2.1'
        exclude 'META-INF/ASL2.0'
    }
}
// now in main activity...

// here is working code for parsing and differentiating keys and values without knowing the structure of the json 
ArrayList<String> jsonKeys;
    Object[] arr3;
    ArrayList<String> jKeys;


    ArrayList<String> jsonValues;
    Object[] arr2;
    ArrayList<String> jValues;

dataObject = new ArrayList<String>();
        jKeys = new ArrayList<String>();
        jValues = new ArrayList<String>();

        final String json = "{\"code\":100,\"payload\":{\"address1\":\"sggsgzg\",\"didPassWelcome\":false,\"didSetPasscode\":false,\"didSetPassword\":false,\"didVerifyDwolla\":false,\"didVerifyEmail\":false,\"email\":\"vzvzbbzb@gzgs.com\",\"firstName\":\"waseem\",\"id\":107,\"isStriprConnected\":true,\"lastName\":\"imran\",\"phone\":\"923017948684\",\"profileImage\":\"http://staging.api.giivv.com/resources/9cc82b7a-9665-4980-a54e-1ef45582cb66.jpg\",\"role\":4,\"userCreateTime\":\"2017-06-20\"}}";
              //String z = "{code:100,payload:{address1:sggsgzg,didPassWelcome:false,didSetPasscode:false,didSetPassword:false,didVerifyDwolla:false,didVerifyEmail:false,email:vzvzbbzb@gzgs.com,firstName:waseem,id:107,isStriprConnected:true,lastName:imran,phone:923017948684,profileImage:http://staging.api.giivv.com/resources/9cc82b7a-9665-4980-a54e-1ef45582cb66.jpg,role:4,userCreateTime:2017-06-20}}";
// calling parsing method
                parse2(json);

//here is the method

public void parse2(String json) {
        try {
            JsonFactory f = new JsonFactory();
            JsonParser token = f.createParser(json);


            jsonKeys = new ArrayList<>();
            jsonValues = new ArrayList<>();

            String j = "";
            String key = "";

            while (token.nextToken() != JsonToken.END_OBJECT) {

                if (token.getCurrentToken().equals(JsonToken.START_ARRAY)) {
                    System.out.println(token.getText());
                    j = token.getText();
              //      Log.e("JSON value arrS:", j);
                    jsonValues.add(j);

                } else if (token.getCurrentToken().equals(JsonToken.END_ARRAY)) {
                    System.out.println(token.getText());
                    j = token.getText();
             //       Log.e("JSON value arrE:", j);
                    jsonValues.add(j);


                } else if (token.getCurrentToken().equals(JsonToken.START_OBJECT)) {
                    System.out.println(token.getText());
                    j = token.getText();
              //      Log.e("JSON value ObjectStart:", j);
                    jsonValues.add(j);


                } else if (token.getCurrentToken().equals(JsonToken.END_OBJECT)) {
                    System.out.println(token.getText());
                    j = token.getText();
           //         Log.e("JSON value ObjectEnd:", j);
                    jsonValues.add(j);


                } else if (token.getCurrentToken().equals(JsonToken.FIELD_NAME)) {
                    System.out.println(token.getText());
                    j = token.getText();
           //         Log.e("JSON value FieldName:", j);
                    jsonKeys.add(j);


                } else if (token.getCurrentToken().equals(JsonToken.VALUE_FALSE)) {
                    System.out.println(token.getText());
                    j = token.getText();
           //         Log.e("JSON value False:", j);
                    jsonValues.add(j);

                } else if (token.getCurrentToken().equals(JsonToken.VALUE_NULL)) {
                    System.out.println(token.getText());
                    j = token.getText();
           //         Log.e("JSON value null:", j);
                    jsonValues.add(j);

                } else if (token.getCurrentToken().equals(JsonToken.VALUE_NUMBER_FLOAT)) {
                    System.out.println(token.getText());
                    j = token.getText();
          //          Log.e("JSON value NumFLOAT:", j);
                    jsonValues.add(j);

                } else if (token.getCurrentToken().equals(JsonToken.VALUE_NUMBER_INT)) {
                    System.out.println(token.getText());
                    j = token.getText();
         //           Log.e("JSON value NumINT:", j);
                    jsonValues.add(j);

                } else if (token.getCurrentToken().equals(JsonToken.VALUE_STRING)) {
                    System.out.println(token.getText());
                    j = token.getText();
        //            Log.e("JSON value STRING:", j);
                    jsonValues.add(j);


                } else if (token.getCurrentToken().equals(JsonToken.VALUE_TRUE)) {
                    System.out.println(token.getText());
                    j = token.getText();
         //           Log.e("JSON value TRUE", j);
                    jsonValues.add(j);

                } else {
                    System.out.println(token.getText());
                    j = token.getText();
          //          Log.e("JSON value ELSE:", j);
                    jsonValues.add(j);
                }
            }
            System.out.println("MY JSON KV FILE");
            System.out.println("this is the file \n");

            arr3 = new Object[jsonKeys.size()];
            arr3 = (Object[]) jsonKeys.toArray();

            for (Object t : arr3) {

                Log.e("JSON KEy File:", (String) t);
                jKeys.add(t.toString());

            }

            arr2 = new Object[jsonValues.size()];
            arr2 = (Object[]) jsonValues.toArray();


            for (Object t2 : arr2) {

                Log.e("JSON Value File:", (String) t2);
                jValues.add(t2.toString());

            }

        } catch (Exception e) {
            System.out.println(e);

        }
    }
// output in console:
JsonKeys:  17

JsonKeys: [code, payload, address1, didPassWelcome, didSetPasscode, didSetPassword, didVerifyDwolla, didVerifyEmail, email, firstName, id, isStriprConnected, lastName, phone, profileImage, role, userCreateTime]

JsonValues:  18

JsonValues: [{, 100, {, sggsgzg, false, false, false, false, false, vzvzbbzb@gzgs.com, waseem, 107, true, imran, 923017948684, http://staging.api.giivv.com/resources/9cc82b7a-9665-4980-a54e-1ef45582cb66.jpg, 4, 2017-06-20]