我正在尝试从Javascript向Java servlet发送不同类型的数组。
用于生成和发送数据的Javascript代码是:
function sendDataOnButtonPress()
{
var obj1 = {'key_11': "val_11", 'key_12': "val_12"};
var obj2 = {'key_21': "val_21", 'key_22': "val_22"};
var myArray = [obj1, obj2];
var params = {
data: JSON.stringify(myArray)
};
$.post("serv1", $.param(params), function(response) {
console.log("response = " + response);
});
}
用于处理此数据的Java代码是:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
@WebServlet("/serv1")
public class serv1 extends HttpServlet {
private static final long serialVersionUID = 1L;
public serv1() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String data = request.getParameter("data");
//System.out.println(data);
ObjectMapper mapper = new ObjectMapper();
Object[] objs = mapper.readValue(data, Object[].class);
System.out.println(objs[0]);
PrintWriter writer1 = response.getWriter();
String htmlRespone = "Dummy response";
writer1.println(htmlRespone);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
虽然行System.out.println(objs[0]);
正在输出数组的第一个对象,但我无法弄清楚如何访问对象的属性:
System.out.println(objs[0]["key_11"]);
无法编译。
所以,我的问题是如何正确解析Java内部从javascript发送的数据?
我也愿意使用除Jackson以外的任何json解析库。
答案 0 :(得分:1)
您可以按如下方式获取。超类Object无法按指示获取值,因此编译器错误。
要了解哪个是特定类型,我打印了对象的类。在这种情况下,它是LinkedHashMap。因此我安全地将obj [0]转换成了那个。一旦我有了地图,我总能得到一个查找关键字的值。希望这有帮助
String data = "[{\"key_11\": \"val_11\", \"key_12\": \"val_12\"}, {\"key_21\": \"val_21\", \"key_22\": \"val_22\"}]";
ObjectMapper mapper = new ObjectMapper();
Object[] objs = mapper.readValue(data, Object[].class);
System.out.println(objs[0].getClass().getName());
LinkedHashMap<String, Object> keyValues = (LinkedHashMap) objs[0];
System.out.println(keyValues.get("key_11"));
答案 1 :(得分:0)
您可以使用jsonNode
执行此类操作String json = "{ \"query\": { \"pageids\": [ \"736\" ], \"pages\": { \"736\": { \"pageid\": 736, \"ns\": 0, \"title\": \"Albert Einstein\", \"contentmodel\": \"wikitext\", \"pagelanguage\": \"en\", \"touched\": \"2014-01-05T03:14:23Z\", \"lastrevid\": 588780054, \"counter\": \"\", \"length\": 106159 } } } }";
ObjectMapper mapper = new ObjectMapper();
JsonNode node =mapper.readTree(json);
node = node.get("query").get("pages");
Map<String, Page> pages = mapper.readValue(node.traverse(), new TypeReference<Map<String, Page>>() {
});
System.out.println(pages.get("yourkey");
答案 2 :(得分:0)
GSON库也可用于解析数据(https://github.com/google/gson)
String data = request.getParameter("data");
JsonElement jelement = new JsonParser().parse(data);
JsonArray output = jelement.getAsJsonArray();
JsonElement outputElement=output.get(0);
JsonObject iObjectOutput=outputElement.getAsJsonObject();
String value1 = iObjectOutput.get("key_11");
答案 3 :(得分:0)
The accepted answer的解决方案可缩短为:
System.out.println(((LinkedHashMap)objs[0]).get("key_11"));