2016-09-06 157 views
0

我试图从Javascript向Java servlet发送不同类型的数组。解析不同对象类型的json数组

用于产生和发送数据的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发送的数据?

我打算使用除杰克逊以外的任何json解析库。

回答

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

The accepted answer的溶液可缩短为:

System.out.println(((LinkedHashMap)objs[0]).get("key_11"));