Использование JSON в PHP


я использую json-простой из Java для получения и запроса данных в формате JSON из PHP. Но я не придумал, как сделать правильный код из PHP для отправки и получения и в Java для получения.

JAVA-код для отправки и получения

import org.json.simple.JSONObject;
import org.json.simple.JSONValue;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class JSONManager<T> {

    // CLASS PROPERTIES

    private static JSONManager ourInstance = new JSONManager();

    private static final String USER_AGENT = "Mozilla/5.0";
    private static final String SERVER_PATH = "http://localhost/";

    // CLASS METHODS

    public static JSONManager getInstance() {
        return ourInstance;
    }

    // CONSTRUCTORS

    private JSONManager() {
    }

    // METHODS

    public synchronized void send() throws IOException{

        // SE AÑADEN ALGUNOS DATOS...

        final JSONObject jsonObject = new JSONObject();

        jsonObject.put("name","foo");
        jsonObject.put("age", 20);

        final List listOfJSONObjects = new LinkedList<>(Arrays.asList(jsonObject));

        // SE GENERA EL STRING DE JSON...

        String jsonString = JSONValue.toJSONString(listOfJSONObjects);

        // SE MUESTRA POR CONSOLA EL JSON GENERADO...

        System.out.printf("JSON generado: %s \n\n", jsonString);

        // SE CODIFICA EL JSON A UNA URL

        jsonString = URLEncoder.encode(jsonString, "UTF-8");
        String urlString = SERVER_PATH+"onListenerJSONJava.php"; // TODO <-- No se cómo debe ser el código allí.

        // SE GENERA UNA URL Y SE ABRE LA CONEXIÓN CON EL SERVIDOR

        final HttpURLConnection huc = (HttpURLConnection) new URL(urlString).openConnection();

        // SE AÑADE LA CABECERA

        huc.setRequestMethod("POST");
        huc.setRequestProperty("User-Agent", USER_AGENT);
        huc.setRequestProperty("Accept-Language", "en-US,en;q=0.5");

        // SE ENVIAN LOS DATOS

        final String postParameters = "jsonJAVA="+jsonString;

        huc.setDoOutput(true);
        final DataOutputStream dos = new DataOutputStream(huc.getOutputStream());
        dos.writeBytes(postParameters);
        dos.flush();
        dos.close();

        // SE CAPTURA LA RESPUESTA DEL SERVIDOR

        final int responseCode = huc.getResponseCode(); // TODO <-- No se cómo debe ser el código allí.

        BufferedReader br = new BufferedReader(new InputStreamReader(huc.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = br.readLine()) != null) {
            response.append(inputLine);
        }

        // SE MUESTRA POR CONSOLA EL 'MENSAJE' ENVÍADO AL SERVIDOR Y SU CÓDIGO DE RESPUESTA

        System.out.printf("\nSending 'POST' request to URL: %s\nPost parameters: %s\nResponse code: %d\n",
                urlString, postParameters,responseCode);

        // SE MUESTRA LA RESPUESTA DEL SERVIDOR Y SE CIERRA LA CONEXIÓN

        System.out.printf("\nResponse: %s:",response.toString());
        br.close();
    }

    public <T extends Object> T receive() {
        // TODO <-- No sé hacerlo aquí.
        return null;
    }

}

PHP код для получения. / / Fala отправить...

    if(isset($_POST["jsonJAVA"])){

        $json = $_POST["jsonJAVA"];

        // EN ESTE PUNTO NO SÉ COMO OBTENER EL JSON DESDE MI APP EN JAVA Y RESPONDER POR SUPUESTO...

            // TODO

        // GUARDAR DATOS EN BBDD SI ES NECESARIO TRAS VALIDARLOS...

            // TODO <-- Esto ya sé hacerlo.
    }

?>
Author: dddenis, 2016-02-02

3 answers

С частью Java я могу вам помочь.

Чтобы отправить данные на сервер, мы, очевидно, собираемся использовать метод POST; что мне не нравится в подходе, который вы используете, так это то, как вы создаете JSON. Java является объектно-ориентированным языком, и поэтому проблемы должны решаться таким образом, я предлагаю вам следующее:

Предположим, что я хочу отправить JSON типа Person, у человека есть атрибуты имя и фамилия; поэтому я создаю объект Person следующим образом:

public class Persona {
    private String nombre;
    private String apellido;

    //incluir los metodos get y set para cada atributo
}

Затем где-то в моем коде я должен заполнить сюжет, который я хочу отправить на сервер, либо по базе данных, либо статическими данными

 Persona p = new Persona();
 p.setNombre("Yo");
 p.setApellido("Tu");

Чтобы преобразовать этот класс в JSON в полете, я рекомендую Это, которое я сделал с помощью Gson

private static Gson gson = new Gson();

public static String objetoAJson(Object o) {
    return gson.toJson(o);
}

Таким образом, вы просто передаете объект (список или уникальный объект) методу objetoAJson, и String будет возвращен с вашим JSON, готовым к отправке.

Теперь, после того, как у вас есть JSON готов, вы должны отправить его с POST

Я предлагаю вам этот метод

public static String sendPost(String url, String data) throws Exception {

        HttpURLConnection  con = (HttpURLConnection) new URL(url).openConnection();

        con.setRequestProperty("User-Agent", USER_AGENT);
        con.setRequestProperty("Accept","*/*");
        con.setRequestProperty("Content-Type","application/json");

        con.setDoOutput(true);
        con.setDoInput(true);

        DataOutputStream wr = new DataOutputStream(con.getOutputStream());
        wr.writeBytes(data);
        wr.flush();
        wr.close();
        data = null;

        System.out.println("\nSending 'POST' request to URL : " + url);

        InputStream it = con.getInputStream();
        InputStreamReader inputs = new InputStreamReader(it);

        BufferedReader in = new BufferedReader(inputs);
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }

        in.close();

        System.out.println("Servidor dice : " + response.toString());
        return response.toString();
    }

Вам просто нужно определить URL-адрес, куда должен поступать контент, и, конечно же; контент (JSON), который вы собираетесь отправлять. Остальное зависит от вашего кода на сервере, который находится в PHP, и там, если я не знаю, потому что я избегаю PHP.

Чтобы получить JSON с вашего сервера, мы используем GET (еще проще)

public static InputStream getJson(String _url) {
        try{
            URL url = new URL(_url);
            URLConnection urlConnection = url.openConnection();
            return urlConnection.getInputStream();
        }catch(Exception e) {
            return null;
        }
}

Результат будет возвращен в InputStream, который может быть преобразован в String так:

String text = new Scanner(>>aquí tu stream recibido<<).useDelimiter("\\A").next();

И вуаля, у вас будет ответ сервера (JSON или какая-то ошибка), и вы сможете работать с ним.

Любые сомнения, на заказ. Приветствую!

 4
Author: Rosendo Ropher, 2016-02-04 17:32:28

Насколько я понимаю, вы выполняете запрос XHR из Java в PHP, в котором содержимое запроса является JSON. Если это так, в вашем файле PHP способ интерпретации будет использовать json_decode().

<?php

    if(isset($_POST["jsonJAVA"])){
        $json = json_decode($_POST["jsonJAVA"]);

        # De aquí en adelante es validar, guardar en DB 
        # y responder

    }
 2
Author: rotvulpix, 2016-02-03 15:07:56

PHP должен возвращать какой-то тип данных HTML. PHP работает на стороне сервера, а запрос JAVA выполняется на стороне клиента, поэтому вам нужно написать некоторые данные типа HTML, как если бы вы посещали веб-страницу. Я объясняю с вашим примером:

<?php
    // Comprobacion
    if(isset($_POST["jsonJAVA"])){
        // Ejecutas todo el contenido que quieras hacer con esta
        // variable, ya sea guardar o sacar datos.
        // Si quisieras sacar valores a datos json seria:
        $json['nombre_salida'][] = array('variable' => 'dato', 'variable' => 'dato'); //Etc
    }
    // Finalmente necesitamos establecer las cabeceras y sacar los datos a HTML
    header('Content-Type: application/json');
    header('Content-Type: text/html; charset=utf-8');
    echo json_encode($json);
?>

Это будет синтаксис. С уважением.

 0
Author: El Tito Barte, 2016-02-03 17:16:44