有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JSON未确定字符串错误

我的Android应用程序的HTTP请求有问题
我正在尝试获取此JSON字符串:

{
    "produto": [
        {
            "pro_id": 2,
            "pro_nome": "MELAO TIPO12"
        },
        {
            "pro_id": 3,
            "pro_nome": "MAMAO PAPAIA TIPO 15"
        },
        {
            "pro_id": 4,
            "pro_nome": "MELANCIA GRANDE"
        },
        {
            "pro_id": 11,
            "pro_nome": "MARACUJA SUPER"
        },
        {
            "pro_id": 17,
            "pro_nome": "MORANGO"
        },
        {
            "pro_id": 18,
            "pro_nome": "MANGA THOMY 12"
        },
        {
            "pro_id": 19,
            "pro_nome": "ABACAXI PEROLA TIPO 5"
        },
        {
            "pro_id": 20,
            "pro_nome": "ABACAXI PEROLA TIPO 15"
        },
        {
            "pro_id": 21,
            "pro_nome": "ABACAXI HAWAI 1IPO 4"
        },
        {
            "pro_id": 22,
            "pro_nome": "ABACAXI HAWAI TIPO 15"
        },
        {
            "pro_id": 23,
            "pro_nome": "ABACAXI HAWAI TIPO 5"
        },
        {
            "pro_id": 29,
            "pro_nome": "ABACAXI PEROLA TIPO 4"
        },
        {
            "pro_id": 30,
            "pro_nome": "ABACAXI PEROLA TIPO 5 PEQUENO"
        },
        {
            "pro_id": 36,
            "pro_nome": "ABACAXI HAWAI TIPO 10"
        },
        {
            "pro_id": 41,
            "pro_nome": "ABACATE"
        },
        {
            "pro_id": 44,
            "pro_nome": "AMEIXA IMPORT"
        },
        {
            "pro_id": 45,
            "pro_nome": "AMENDOIM TORRADO COM CASCA"
        },
        {
            "pro_id": 51,
            "pro_nome": "MARACUJA 3A"
        },
        {
            "pro_id": 52,
            "pro_nome": "MARACUJA 2A"
        },
        {
            "pro_id": 53,
            "pro_nome": "MANGA THOMY TIPO 15"
        },
        {
            "pro_id": 56,
            "pro_nome": "MAMAO PAPAIA TIPO 18"
        },
        {
            "pro_id": 59,
            "pro_nome": "MAMAO PAPAI 21"
        },
        {
            "pro_id": 60,
            "pro_nome": "COCO SECO 10"
        },
        {
            "pro_id": 61,
            "pro_nome": "COCO SECO 20"
        },
        {
            "pro_id": 64,
            "pro_nome": "MELAO TIPO 10"
        },
        {
            "pro_id": 66,
            "pro_nome": "MELAO TIPO7"
        },
        {
            "pro_id": 68,
            "pro_nome": "MACA FUJI 100 CAT1"
        },
        {
            "pro_id": 70,
            "pro_nome": "MACA FUJI 150"
        },
        {
            "pro_id": 71,
            "pro_nome": "MACA GALA CAT1 120"
        },
        {
            "pro_id": 73,
            "pro_nome": "MACA GALA 120 CAT2"
        },
        {
            "pro_id": 76,
            "pro_nome": "MELANCIA JAPONESA"
        },
        {
            "pro_id": 77,
            "pro_nome": "MELANCIA MEDIA"
        },
        {
            "pro_id": 78,
            "pro_nome": "MELANCIA PEQUENA"
        },
        {
            "pro_id": 79,
            "pro_nome": "MACA GALA150"
        },
        {
            "pro_id": 80,
            "pro_nome": "MACA GALA180"
        },
        {
            "pro_id": 81,
            "pro_nome": "MACA GALA216"
        },
        {
            "pro_id": 82,
            "pro_nome": "MACA GALA 135 CAT 1"
        },
        {
            "pro_id": 84,
            "pro_nome": "MACA FUJI120"
        },
        {
            "pro_id": 85,
            "pro_nome": "MACA FUJI GRANEL"
        },
        {
            "pro_id": 86,
            "pro_nome": "MACA GALA GRANEL"
        },
        {
            "pro_id": 87,
            "pro_nome": "MACA ARGENTINA100"
        },
        {
            "pro_id": 88,
            "pro_nome": "MACA VERDE "
        },
        {
            "pro_id": 89,
            "pro_nome": "PERA T90"
        },
        {
            "pro_id": 90,
            "pro_nome": "UVA RED GLOB"
        },
        {
            "pro_id": 91,
            "pro_nome": "UVA TOPSON"
        },
        {
            "pro_id": 92,
            "pro_nome": "PESSEGO IMPORT"
        },
        {
            "pro_id": 94,
            "pro_nome": "KIWI IMPORT"
        },
        {
            "pro_id": 95,
            "pro_nome": "NECTARINA "
        },
        {
            "pro_id": 96,
            "pro_nome": "PERA ESPANHOLA "
        },
        {
            "pro_id": 97,
            "pro_nome": "PERA PORTUGUESA"
        }
    ]
}

但是我得到了这个例外Unterminated object at character 1927 of "MY JSON STRING"

这是我对URL执行HTTP请求的方法:

  public String ConsultaServidor(String URL_STRING) throws IOException {
        InputStream is = null;

        try {
            URL url = new URL(URL_STRING);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(10000);
            conn.setReadTimeout(15000);
            conn.setRequestMethod("GET");
            conn.setDoInput(true);
            conn.connect();
            conn.getResponseCode();

            is = conn.getInputStream();

            Reader reader = null;
            reader = new InputStreamReader(is);
            char[] buffer = new char[4096];
            reader.read(buffer);
            return new String(buffer);
        } finally {
            if (is != null) {
                is.close();
            }
        }
    }

有人能帮我吗


共 (3) 个答案

  1. # 1 楼答案

    使用{cd1}而不是单独使用{cd1}

    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String s = null;
    StringBuilder sb = new StringBuilder ();
    while((s = br.readLine()) != null )
    sb.append(s); 
    return sb.toString();
    
  2. # 2 楼答案

    解决方案是更改代码。正如Ankit所说,使用BufferedReader。。
    最终代码如下:

     public String ConsultaServidor(String URL_STRING) throws IOException {
            //InputStream is = null;
    
            try {
                URL url = new URL(URL_STRING);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setConnectTimeout(10000);
                conn.setReadTimeout(15000);
                conn.setRequestMethod("GET");
                conn.setDoInput(true);
                conn.connect();
                conn.getResponseCode();
    
    
                // is = conn.getInputStream();
                BufferedReader in = new BufferedReader(new InputStreamReader(
                        conn.getInputStream()));
    
                // Reader reader = null;
                // reader = new InputStreamReader(is);
                String inputLine;
                String responseData;
                responseData = "";
                while ((inputLine = in.readLine()) != null) // read till you can receive any data
                    responseData += inputLine;
                in.close();
                return new String(responseData);
            } finally {
                //if (in != null) {
                //    in.close();
                // }
            }
        }
    
  3. # 3 楼答案

    使用从输入流读取的单个缓冲区意味着,如果缓冲区中的字符数少于缓冲区中的字符数,那么字符串的结尾将有大量零字符(ASCII NUL-'\u0000'

    如果你有更多的字符,而不是缓冲区的大小,那么你的字符串只包含前4096个字符,所以中间是剪切的。p>

    读取输入流的常用方法是使用循环。您可以将整个输入流读入内存,也可以使用直接使用输入流的JSON解析器

    因为我不知道您使用的是什么JSON解析器,所以我将演示一种方法

            is = conn.getInputStream();
    
            StringBuilder sb = new StringBuilder();
    
            try ( Reader reader = new InputStreamReader(is) ) {
                char[] buffer = new char[4096];
                int numRead;
                while ( (numRead = reader.read(buffer)) != -1 ) {
                    sb.append(buffer, 0, numRead );
                }
            } catch ( IOException e ) {
                e.printStackTrace(); // Or other exception handling
            }
    
            return sb.toString();
    

    请注意,在这个方法中,您一直读取流,直到最后,也就是从read返回的值为-1。每次你只附加实际读取的字符数(不一定是4096!)给字符串生成器

    还要注意的是,你在参考资料中进行了一次尝试,确保完成后关闭阅读器

    另一种方法是使用BufferedReader并逐行读取,直到文件结束