Я пытаюсь опубликовать следующий пример массива, из php, в сервлет Java:
$tags = $tagger->tag($nlquery);
$js_string = json_encode($tags);
echo $js_string
результат:
{"Example","NN"},{"1","NN"}
Код cUrl:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://localhost:8080/first/SPARQL");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $js_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($js_string)));
curl_setopt($ch, CURLOPT_VERBOSE, 1);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
код сервлета Java:
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
res.setContentType("text/html");
res.addHeader("Access-Control-Allow-Origin", "*");
PrintWriter out = res.getWriter();
String jsonData[];
jsonData= req.getParameterValues("js_string");
for(int i = 0; i < jsonData.length; i++)
{
System.out.println(jsonData[i]);
}
Однако это приводит к NullPointerException
на стороне Java на jsonData.length
линия. Я неправильно передаю $ js_string со стороны php? Или что-то не так с кодом на стороне Java?
Обновить:
Используя следующий код:
BufferedReader br = new BufferedReader(new InputStreamReader (req.getInputStream()));
String str = br.readLine();
String[] jsondata = new String[]{str};
int i;
for(i=0; i < jsondata.length;i++){
System.out.println(jsondata[i]);
}
возвращает правильный результат {"Example","NN"},{"1","NN"}
тем не менее, теперь я не могу пройти через него, потому что он не видит его как многомерный массив. Это код, с которым я работал до использования сервлета (статический, для разработки)
String[][] phpsearch ={{"Example","NN"},{"1","NN"}};
for(int i=0; i<phpsearch.length; i++) {
System.out.println("loop "+i);
if(phpsearch[i][1]=="NN"){
result=searchLabel(phpsearch[i][0].toLowerCase());
System.out.println("array "+phpsearch[i][0] );
}
}
Может быть, не так эффективно, но по крайней мере это работает:
BufferedReader br = new BufferedReader(new InputStreamReader (req.getInputStream()));
String str = br.readLine();
str = str.replace(",", "|");
str = str.replace("}|{", ",");
str = str.replace("}", "");
str = str.replace("{", "");
String[] rows = str.split(",");
System.out.println("rows");
for(int i=0; i<rows.length; i++) {
System.out.println("loop "+i);
System.out.println(rows[i]);
//System.out.println(jsondata[i][1]);
}
String[][] jsondata = new String[rows.length][];
int r = 0;
for (String row : rows) {
jsondata[r++] = row.split("\\|");
}
System.out.println("jsondata");
for(int i=0; i<jsondata.length; i++) {
System.out.println("loop "+i);
System.out.println(jsondata[i][0]);
System.out.println(jsondata[i][1]);
//System.out.println(jsondata[i][1]);
}
В результате получается двумерный массив, как в приведенном выше статическом примере.
Попробуй это
BufferedReader br = new BufferedReader(new InputStreamReader (req.getInputStream()));
String str = br.readLine();
System.out.println(str);
// JSONObject data = new JSONObject(str);
Это сработало для меня.
Других решений пока нет …