解析JSON字符串返回undefined

时间:2015-03-02 10:10:17

标签: java javascript jquery json angularjs

这是我的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.

此处是否有任何问题或如何访问“event_id”字段?

2 个答案:

答案 0 :(得分:1)

首先,您需要重新计算 getEvents 方法以仅返回普通对象(例如列表),然后在传递之前将结果放入目标地图它是 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);

答案 1 :(得分:0)

我改变了我的java方法,如下所示:

&#13;
&#13;
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;

}
&#13;
&#13;
&#13;

并使用dto类如下:

&#13;
&#13;
public class UKDashboardEventDTO implements Serializable{

    private Long eventId;
  
  ............
  
 }
&#13;
&#13;
&#13;

并传递如下值:

&#13;
&#13;
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) {

}
&#13;
&#13;
&#13;

不希望对客户端逻辑做任何更改。这有效!

相关问题