如何使用Java将带空格的json字符串传递给Python脚本?

时间:2018-12-25 20:15:52

标签: java python

我正在尝试使用Java来运行Python脚本,如下所示:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.HashMap;
import java.util.Map;

import com.google.gson.Gson;

public class JsonToString {
    public static void main(String[] args) throws Exception {
        Map<String, String> map = new HashMap<>();

        map.put("Query", "test projects");
        Gson gson = new Gson();
        String json = gson.toJson(map);
        System.out.println("json:" + json);

        String scriptCmd = "python /Scripts/search_php.py \"" + json+"\"";
        System.out.println("scriptCmd:" + scriptCmd);

        Process p = Runtime.getRuntime().exec(scriptCmd);
        System.out.println("process:" + p);
        p.waitFor();
        System.out.println("process wait completed");
        String line;
        BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        System.out.println("*******ERROR*******");
        while ((line = error.readLine()) != null) {
            System.out.println(line);
        }
        error.close();

        System.out.println("*******INPUT*******");
        BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while ((line = input.readLine()) != null) {
            System.out.println(line);
        }
        input.close();

        System.out.println("*******OUTPUT*******");
        OutputStream outputStream = p.getOutputStream();
        PrintStream printStream = new PrintStream(outputStream);
        printStream.println();
        printStream.flush();
        printStream.close();
    }
}

Python脚本的值如下:

argv data :"{"Query":"test

它忽略空格后的值。 基本上,我必须将json字符串作为参数传递给python脚本。

{"Query":"test projects"}

要传递带有空格的字符串(json字符串)作为参数,我用双引号括起来,并且/也对其进行转义。 但是我无法传递确切的字符串。 该怎么做?

1 个答案:

答案 0 :(得分:2)

如果使用ProcessBuilder类,则可以使用参数列表(而不仅仅是参数字符串)启动进程。如果使用此类,则可以将整个JSON字符串放入单个参数中,然后直接在Python端进行访问。

但是,命令行参数的大小可能会有所限制。 (限制因操作系统而异,并且还取决于系统配置。)将JSON数据写入Python进程的标准输入可能更可靠。 ProcessBuilder类也为此提供了一种机制。