繁体   English   中英

Java EE JSON-P流API解析数据对象

[英]Java EE JSON-P streaming API Parsin data Object

我在解析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读取数组的问题,因为JsonParser拥有的方法仅仅是:

  • .getBigDecimail()
  • .getInt()
  • .getLocation()
  • .getLong()
  • .getString()
  • .getClass()

我必须说我已经使用JSON-P对象模型API做到了,但是对于我所在大学的项目,他们要我使用JSON-P流API

提前致谢!

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM