解析不同对象类型的{j}数组

时间:2016-09-06 10:04:37

标签: javascript java arrays json jackson

我正在尝试从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解析库。

4 个答案:

答案 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"));