简体   繁体   English

解析JSON字符串返回未定义

[英]Parsing JSON string returns undefined

This is my java method: 这是我的java方法:

 public String getEvents(String cat, int start, int step) { //JSONArray list = new JSONArray(); List<String> list = new ArrayList(); if (cat.equalsIgnoreCase("D")){ for (int i=0; i<listDog.size(); i++){ JSONObject obj = new JSONObject(); System.out.println("di=" + i + "=" + (String)listDog.get(i)); obj.put("event_id",new String((String)listDog.get(i))); list.add(obj.toJSONString()); } } else { for (int i=0; i<listHorse.size(); i++){ JSONObject obj = new JSONObject(); System.out.println("i=" + i + "=" + (String)listHorse.get(i)); obj.put("event_id",new String((String)listHorse.get(i))); list.add(obj.toJSONString()); } } return list.toString(); } 

and below is how I convert it to json: 下面是我将其转换为json的方式:

 Map map = new HashMap(); Gson gson = new GsonBuilder().disableHtmlEscaping().create() .... String result = service.getEvents(cat, Integer.parseInt(start), Integer.parseInt(step)); String objs = gson.toJson(result); map.put("result", objs); ..... String output = gson.toJson(map); System.out.println("output->" + output); out.println(output); out.flush(); out.close(); 

I'm getting the below JSON string from the server side: 我从服务器端获取以下JSON字符串:

{
  "result": "\"[{\\\"event_id\\\":\\\"2139114\\\"}]\"",
  "eventList": "[{\"eventId\":164151,\"meetingCode\":\"5G8QV\",\"meetingName\":\"Kranji\",\"eventTime\":\"13:20:00\",\"eventCode\":\"07:50:00\",\"category\":\"HR\"},{\"eventId\":163890,\"meetingCode\":\"5G8MW\",\"meetingName\":\"Henlow\",\"eventTime\":\"02:30:00\",\"eventCode\":\"21:00:00\",\"category\":\"DG\"}]"
}

and I convert it like this: 我将其转换为:

  success: function(data) { console.log("SERVLET DATA: " + data.replace("\\n", "")); if (typeof(data) !== 'undefined' && data !== '' && data !== null) { data = data.replace("\\n", ""); var jsonData = JSON.parse(data); //console.log(jsonData); for (var i in jsonData) { var event = jsonData[i]; var event2 = JSON.stringify(jsonData[i]); var event3 = JSON.parse(event); console.log("init:" + event.event_id); } } 

in all three logs, I'm getting "undefined". 在所有三个日志中,我都变得“未定义”。 Please tell me how can I get the "event_id" value from the below json string? 请告诉我如何从下面的json字符串中获取“ event_id”值?

"result": "\"[{\\\"event_id\\\":\\\"2139114\\\"}]\""

I checked validity of json string online and it says no errors found.

is there any issue here or how to access "event_id" field ? 这里有什么问题或如何访问“ event_id”字段?

Firstly, you need to re-factor the getEvents method to return only plain objects (eg List ), then, put the result in to the target map before passing it to the toJSON method 首先,您需要重构getEvents方法以仅返回普通对象(例如List ),然后将结果放入目标映射中,然后再将其传递给toJSON方法

public class Event {
    String event_id;

    Event(String event_id) {
        this.event_id = event_id;
    }
}

public List<Event> getEvents(String cat, int start, int step)  {

    List<Event> list = new ArrayList<Event>();

    if (cat.equalsIgnoreCase("D")){
        for (int i=0; i<listDog.size(); i++){
            System.out.println("di=" + i + "=" + (String)listDog.get(i));

            list.add( new Event( (String)listDog.get(i) ));
        }
    }
    else {
        for (int i=0; i<listHorse.size(); i++){
            System.out.println("i=" + i + "=" + (String)listHorse.get(i));

            list.add( new Event( (String)listHorse.get(i) ));
        }
    }

    return list;

}

Then, convert your result like this: 然后,像这样转换结果:

Map map = new HashMap();
Gson gson = new GsonBuilder().disableHtmlEscaping().create()

....

List<Event> result = service.getEvents(cat, Integer.parseInt(start), Integer.parseInt(step));

map.put("result", result);

String objs = gson.toJson(map);

I changed my java method as below: 我将我的java方法更改如下:

 public List < UKDashboardEventDTO > getEvents(String cat, int start, int step) { //JSONArray list = new JSONArray(); List < UKDashboardEventDTO > list = new ArrayList(); UKDashboardEventDTO dto; if (cat.equalsIgnoreCase("D")) { for (int i = start - 1; i < listDog.size(); i = i + step) { //JSONObject obj = new JSONObject(); dto = new UKDashboardEventDTO(); System.out.println("di=" + i + "=" + (String) listDog.get(i)); dto.setEventId(Long.parseLong(listDog.get(i).toString())); list.add(dto); } } else if (cat.equalsIgnoreCase("H")) { for (int i = start - 1; i < listHorse.size(); i = i + step) { dto = new UKDashboardEventDTO(); System.out.println("di=" + i + "=" + (String) listHorse.get(i)); dto.setEventId(Long.parseLong(listHorse.get(i).toString())); list.add(dto); } } else if (cat.equalsIgnoreCase("A")) { for (int i = start - 1; i < listAll.size(); i = i + step) { dto = new UKDashboardEventDTO(); System.out.println("di=" + i + "=" + (String) listAll.get(i)); dto.setEventId(Long.parseLong(listAll.get(i).toString())); list.add(dto); } } return list; } 

and used the dto class as below: 并使用了dto类,如下所示:

 public class UKDashboardEventDTO implements Serializable{ private Long eventId; ............ } 

and pass the values like this: 并传递这样的值:

 List < UKDashboardEventDTO > result = service.getEvents(cat, Integer.parseInt(start), Integer.parseInt(step)); map.put("result", result); //out.println(objs); ....... try { String objs = gson.toJson(map); System.out.println("objs->" + objs); out.println(objs); out.flush(); out.close(); } catch (Exception ex) { } 

did not want to do any change to the client side logic. 不想对客户端逻辑进行任何更改。 this works ! 这有效!

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

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