首页 > 解决方案 > Java EE JSON-P 流 API Parsin 数据对象

问题描述

我在解析 JSON 对象中的 JSON 对象时遇到问题,这就是我的 JSON 文件的样子:

    {
     "index":1,
     "name":"Peter",
     "status":"Student",
     "traditional":true,
     "address": 
     {
      "street":"Street1",
      "city":"City1",
      "ZIP":11000
     },
     "phoneNumbers":[1231123,123111],
     "role":"Programmer"
    }

和 parseJson() 方法:

    public String parseJson() { 
    Integer rbr = 0;
    StringReader stringReader = new StringReader(jsonStr);

    JsonParser jsonParser = Json.createParser(stringReader);

    Map<String, Object> jsonMap = new HashMap<>(); 
    String jsonKeyNm = null; 
    Object jsonVal = null;

    while (jsonParser.hasNext()) { 
        JsonParser.Event event = jsonParser.next();

        if (event.equals(Event.KEY_NAME)) { 
            jsonKeyNm = jsonParser.getString(); 
        } 
        else if (event.equals(Event.VALUE_STRING)) { 
            jsonVal = jsonParser.getString(); 
        } 
        else if (event.equals(Event.VALUE_NUMBER)) { 
            jsonVal = jsonParser.getInt(); 
        }
        **else if (event.equals(Event.START_OBJECT)) { 
            if(rbr == 0){
                //The rbr is used, since when first time when it starts going through json it will be an *START_OBJECT* event too.
                rbr++;
                continue;
            }
            jsonVal = jsonParser.getClass(); 
        }**
        else if (event.equals(Event.VALUE_TRUE)) { 
            jsonVal = (Boolean) true; 
        }
        else if (event.equals(Event.VALUE_FALSE)) { 
            jsonVal = (Boolean) false; 
        }
        **else if (event.equals(Event.START_ARRAY)) { 
            jsonVal = event.VALUE_STRING; 
        }**
        else if (event.equals(Event.END_ARRAY)) { 
            jsonVal = event.VALUE_STRING; 
        }

        jsonMap.put(jsonKeyNm, jsonVal);
    }
    student.setName((String)jsonMap.get("name")); 
    student.setIndex((Integer)jsonMap.get("index")); 
    student.setStatus((String)jsonMap.get("status")); 
    student.setTraditional((Boolean)jsonMap.get("traditional"));
    Address address1 = (Address) jsonMap.get("address");
    // Tried this too
    //Address address =(Address) jsonMap.get("address").getClass().cast(Adress.class);
   }

当我执行 jsonMap.get("address") 时它实际返回给我的是 Java.util.class 类型。我又被困住了,无法从中提取任何数据。

有什么帮助我可以接受和使用我得到的对象或我可以用来正确读取所有数据的任何其他方式吗?

此外,我在从 JSON 读取 Array 时遇到问题,因为 JsonParser 拥有的方法只有:

我不得不说我已经使用JSON-P 对象模型 API完成了它,但是对于我的大学项目,他们要求我使用JSON-P 流 API

提前致谢!

标签: javajsonparsingobject

解决方案


public static String parseJson(InputStream in) {
    String key = "student";
    Deque<String> stack = new LinkedList<>();
    Map<String, Object> map = new HashMap<>();
    Object obj = null;

    JsonParser parser = Json.createParser(in);

    while (parser.hasNext()) {
        Event event = parser.next();

        if (event == Event.START_OBJECT) {
            map.putIfAbsent(key, new HashMap<>());
            obj = map.get(key);
            stack.push(key);
        } else if (event == Event.END_OBJECT) {
            stack.pop();
            obj = stack.isEmpty() ? null : map.get(stack.element());
        } else if (event == Event.START_ARRAY) {
            Object tmp = new ArrayList<>();
            setValue(obj, key, tmp);
            obj = tmp;
        } else if (event == Event.END_ARRAY)
            obj = stack.isEmpty() ? null : map.get(stack.element());
        else if (event == Event.KEY_NAME)
            key = parser.getString().toLowerCase();
        else {
            Object value = null;

            if (event == Event.VALUE_STRING)
                value = parser.getString();
            else if (event == Event.VALUE_NUMBER)
                value = parser.getInt();
            else if (event == Event.VALUE_TRUE)
                value = true;
            else if (event == Event.VALUE_FALSE)
                value = false;

            setValue(obj, key, value);
        }
    }

    Student student = new Student();
    student.setName(getMapValue(map, "student", "name"));
    student.setIndex(getMapValue(map, "student", "index"));
    student.setStatus(getMapValue(map, "student", "status"));
    student.setTraditional(getMapValue(map, "student", "traditional"));
    student.setRole(getMapValue(map, "student", "role"));
    student.setPhoneNumbers(getMapValue(map, "student", "phoneNumbers"));

    Address address = new Address();
    address.setStreet(getMapValue(map, "address", "street"));
    address.setCity(getMapValue(map, "address", "city"));
    address.setZip(getMapValue(map, "address", "zip"));

    return "";
}

private static void setValue(Object obj, String key, Object value) {
    if (obj instanceof Map)
        ((Map<String, Object>)obj).put(key, value);
    else
        ((Collection<Object>)obj).add(value);
}

private static <T> T getMapValue(Map<String, Object> map, String obj, String key) {
    Map<String, Object> m = (Map<String, Object>)map.get(obj.toLowerCase());
    return m != null ? (T)m.get(key.toLowerCase()) : null;
}

推荐阅读