2016-09-06 5 views
0

Я пытаюсь отправить массив различных типов из Javascript в сервлет Java.Parse json array различных типов объектов

Код 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"]); 

не может скомпилировать.

Итак, мой вопрос заключается в том, как правильно разобрать данные, отправленные из javascript внутри Java?

Я открыт для использования любой библиотеки разбора json, отличной от Джексона.

ответ

1

Вы можете получить его следующим образом. Объект суперкласса не имеет способа получить значение, как вы указали, следовательно, ошибка компилятора.

Чтобы понять, какой именно тип, я напечатал класс объекта. В этом случае это 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 «s решение может быть сокращен до:

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