为了账号安全,请及时绑定邮箱和手机立即绑定

在不知道JSON格式的情况下以Java解析JSON

在不知道JSON格式的情况下以Java解析JSON

富国沪深 2019-11-28 14:10:59
我试图解析Java中的JSON字符串并找到键值对,以便我可以确定JSON对象的近似结构,因为JSON字符串的对象结构是未知的。例如,一个执行可能具有这样的JSON字符串:  {"id" : 12345, "days" : [ "Monday", "Wednesday" ], "person" : { "firstName" : "David", "lastName" : "Menoyo" } }另一个像这样:  {"url" : "http://someurl.com", "method" : "POST", "isauth" : false }如何循环遍历各种JSON元素并确定键及其值?我看着jackson-core的JsonParser。我知道如何获取下一个“令牌”并确定令牌的类型(即字段名称,值,数组开头等),但是,我不知道如何获取实际令牌的值。例如:public void parse(String json)  {  try {     JsonFactory f = new JsonFactory();     JsonParser parser = f.createParser(json);     JsonToken token = parser.nextToken();     while (token != null) {        if (token.equals(JsonToken.START_ARRAY)) {           logger.debug("Start Array : " + token.toString());        } else if (token.equals(JsonToken.END_ARRAY)) {           logger.debug("End Array : " + token.toString());        } else if (token.equals(JsonToken.START_OBJECT)) {           logger.debug("Start Object : " + token.toString());        } else if (token.equals(JsonToken.END_OBJECT)) {           logger.debug("End Object : " + token.toString());        } else if (token.equals(JsonToken.FIELD_NAME)) {           logger.debug("Field Name : " + token.toString());        } else if (token.equals(JsonToken.VALUE_FALSE)) {           logger.debug("Value False : " + token.toString());        } else if (token.equals(JsonToken.VALUE_NULL)) {           logger.debug("Value Null : " + token.toString());        } else if (token.equals(JsonToken.VALUE_NUMBER_FLOAT)) {           logger.debug("Value Number Float : " + token.toString());        } else if (token.equals(JsonToken.VALUE_NUMBER_INT)) {          logger.debug("Value Number Int : " + token.toString());        } else if (token.equals(JsonToken.VALUE_STRING)) {           logger.debug("Value String : " + token.toString());        } else if (token.equals(JsonToken.VALUE_TRUE)) {jackson或其他库(gson或simple-json)中是否有一个类可以生成树,或者允许一个类循环遍历json元素并获取值之外的实际键名?
查看完整描述

3 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

如果其他库适合您,则可以尝试org.json:


JSONObject object = new JSONObject(myJSONString);

String[] keys = JSONObject.getNames(object);


for (String key : keys)

{

    Object value = object.get(key);

    // Determine type of value and do something with it...

}


查看完整回答
反对 回复 2019-11-28
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

查找以下代码,以使用Gson库解析未知的Json对象。


public class JsonParsing {

static JsonParser parser = new JsonParser();


public static HashMap<String, Object> createHashMapFromJsonString(String json) {


    JsonObject object = (JsonObject) parser.parse(json);

    Set<Map.Entry<String, JsonElement>> set = object.entrySet();

    Iterator<Map.Entry<String, JsonElement>> iterator = set.iterator();

    HashMap<String, Object> map = new HashMap<String, Object>();


    while (iterator.hasNext()) {


        Map.Entry<String, JsonElement> entry = iterator.next();

        String key = entry.getKey();

        JsonElement value = entry.getValue();


        if (null != value) {

            if (!value.isJsonPrimitive()) {

                if (value.isJsonObject()) {


                    map.put(key, createHashMapFromJsonString(value.toString()));

                } else if (value.isJsonArray() && value.toString().contains(":")) {


                    List<HashMap<String, Object>> list = new ArrayList<>();

                    JsonArray array = value.getAsJsonArray();

                    if (null != array) {

                        for (JsonElement element : array) {

                            list.add(createHashMapFromJsonString(element.toString()));

                        }

                        map.put(key, list);

                    }

                } else if (value.isJsonArray() && !value.toString().contains(":")) {

                    map.put(key, value.getAsJsonArray());

                }

            } else {

                map.put(key, value.getAsString());

            }

        }

    }

    return map;

}

}


查看完整回答
反对 回复 2019-11-28
  • 3 回答
  • 0 关注
  • 1080 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信