问题
I have a very complex JSON string, which is been created by GsonBuilder (in xxx.java)
Gson gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
String message = gson.toJson(output);
out.println(message);
and it look like this:
{ "status": "error", "number of record loaded": [ { "bid.csv": 24 }, { "course.csv": 12 }, { "course_completed.csv": 0 }, { "prerequisites.csv": 1 }, { "section.csv": 14 }, { "student.csv": 11 } ], "errorList": [ { "file": "student.csv", "line": 9, "message": [ "duplicate userid" ] }, { "file": "student.csv", "line": 10, "message": [ "invalid e-dollar" ] }, { "file": "student.csv", "line": 11, "message": [ "invalid e-dollar" ] }, { "file": "course.csv", "line": 4, "message": [ "invalid exam start" ] }, { "file": "course.csv", "line": 10, "message": [ "invalid exam date" ] }, { "file": "course.csv", "line": 11, "message": [ "invalid exam date" ] }, { "file": "section.csv", "line": 2, "message": [ "invalid course", "duplicate section" ] }, { "file": "section.csv", "line": 4, "message": [ "invalid section" ] }, { "file": "section.csv", "line": 7, "message": [ "invalid day" ] }, { "file": "section.csv", "line": 8, "message": [ "invalid start" ] }, { "file": "section.csv", "line": 14, "message": [ "invalid size" ] }, { "file": "section.csv", "line": 15, "message": [ "invalid size" ] }, { "file": "section.csv", "line": 18, "message": [ "invalid course", "duplicate section" ] }, { "file": "section.csv", "line": 19, "message": [ "invalid course", "duplicate section" ] }, { "file": "section.csv", "line": 20, "message": [ "invalid course", "duplicate section" ] }, { "file": "section.csv", "line": 21, "message": [ "invalid course", "duplicate section" ] }, { "file": "section.csv", "line": 22, "message": [ "invalid course", "duplicate section" ] }, { "file": "prerequisite.csv", "line": 2, "message": [ "invalid course" ] }, { "file": "prerequisite.csv", "line": 3, "message": [ "invalid prerequisite" ] }, { "file": "course_completed.csv", "line": 2, "message": [ "invalid userid" ] }, { "file": "bid.csv", "line": 2, "message": [ "invalid amount" ] }, { "file": "bid.csv", "line": 3, "message": [ "invalid section" ] }, { "file": "bid.csv", "line": 4, "message": [ "invalid section" ] }, { "file": "bid.csv", "line": 5, "message": [ "not own school course" ] }, { "file": "bid.csv", "line": 6, "message": [ "incomplete prerequisites" ] }, { "file": "bid.csv", "line": 13, "message": [ "section limit reached" ] }, { "file": "bid.csv", "line": 14, "message": [ "insufficient e$" ] } ] }
I wish to pass this value using this code:
context.setAttribute("message", message);
response.sendRedirect("zzz.jsp");
So in zzz.jsp how am I suppose to print the above complex json string to table? It should display something like
LinkedHashMap map = null;
String status = null;
JSONArray jArr = null;
try {
map = (LinkedHashMap) context.getAttribute("bootstrapStatus");
status = (String) map.get("status");
out.println("<p><font color = 'red'> Bootstrap Status: " + status + "</font></p>");
jArr = (JSONArray) map.get("num-record-loaded");
} catch (NullPointerException npe){
status = "Error: no bootstrap";
out.println("<p>"+status + "</p>");
}
if (map != null) {
%>
<div class="CSSTableGenerator" >
<table align='center'>
<tr>
<td>CSV File</td>
<td>Number of records</td>
<tr></tr>
<%
for (Object obj : jArr) {
JSONObject jsonObj = (JSONObject) obj;
Set keys = jsonObj.keySet();
Iterator iter = keys.iterator();
while (iter.hasNext()) {
String fileName = (String) iter.next();
int successLine = (Integer) jsonObj.get(fileName);
out.println("<tr>");
out.println("<td>" + fileName + "</td>");
out.println("<td>" + successLine + "</td>");
out.println("</tr>");
}
}
%>
</table>
</div>
<br/>
<p><strong>Error Messages</strong></p>
<%
if (status.equals("error")) {
%>
<div class="CSSTableGenerator" >
<table align='center'>
<tr>
<td>CSV File</td>
<td>Line number</td>
<td>Error message</td>
<tr></tr>
<%
ArrayList<BootstrapError> errArr = (ArrayList<BootstrapError>) map.get("error");
for (BootstrapError error : errArr) {
out.println("<tr>");
out.println("<td>" + error.getFile() + "</td>");
out.println("<td>" + error.getLine() + "</td>");
out.println("<td>" + error.getMessage() + "</td>");
out.println("</tr>");
}
}
}
%>
</table>
and I know theres an error with regards with this: map = (LinkedHashMap) context.getAttribute("message"); so I changed it to:
String s = (String) context.getAttribute("message");
LinkedHashMap map = new LinkedHashMap();
map.put("message",s);
String status = (String) map.get("status"); <<< this appear null
JSONArray jArr = (JSONArray) map.get("num-record-loaded"); <<< this appears Null
Any help would be kindly appreciated! (:
回答1:
I don't understand the reason of packing into JSON, if all you wanted to do is use scriptlets & display it. You could have simply sent the
outputobject itself through context to the redirected page.I guess you have something else in mind. Talking about the question, here's how you can do it :
String temp=map = (LinkedHashMap) context.getAttribute("message");
JsonParser jp = new JsonParser();
JsonElement ele = jp.parse(temp);
JsonObject obj=ele.getAsJsonObject();
JsonArray jArr =Jsobj.get("number of record loaded").getAsJsonArray();
Update
The way of iterating over the JsonArray isn't correct, here's a sample on how to iterate over JsonArray :
Iterator<JsonElement> msg = jsonArray.iterator();
while (msg.hasNext()) {
////prints json array values
JsonElement eleTemp = msg.next();
JsonObject jObj = eleTemp.getAsJsonObject();
//... Other code
}
来源:https://stackoverflow.com/questions/19808462/print-json-string-to-html-table