解析JSON字符串返回未定义的结果

Parsing JSON string returns undefined

本文关键字:结果 未定义 返回 JSON 字符串 解析      更新时间:2023-09-26

这是我的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();
		
	}

下面是我如何将其转换为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();

我从服务器端得到以下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'"}]"
}

我把它转换成这样:

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

在所有三个日志中,我都得到了"未定义"。请告诉我如何从下面的json字符串中获取"event_id"值?

"result": "'"[{'''"event_id'''":'''"2139114'''"}]'""
I checked validity of json string online and it says no errors found.

这里有什么问题吗?或者如何访问"eventid"字段?

首先,您需要重新考虑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;
}

然后,像这样转换你的结果:

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

我更改了我的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;
}

并使用dto类如下:

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

并传递这样的值:

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) {
}

不想对客户端逻辑做任何更改。这很管用!