【问题标题】:What is the key of a JSON-encoded StringJSON 编码的字符串的键是什么
【发布时间】:2012-10-19 15:47:14
【问题描述】:

我有一个 Java 应用程序使用 JSON 通过 PHP 脚本与 SQL 数据库进行通信。我之前使用 JSON 对数组进行 json_encode,效果很好,您可以使用每个条目的键调用 Java 中的值。但是现在,我在 PHP 中对一个字符串进行了 json_encoded,如下所示: json_encode("Succes!"); 现在,我如何在 Java 业务方面请求该值?我需要一些东西作为键放入jsonResponse.getString('key');。关键是什么……

希望你能理解我的问题...

public String send(String username, String password, String database){
    //Create a HTTPClient as the form container
    HttpClient httpclient;

//Use HTTP POST method
HttpPost httppost;

//Create an array list for the input data to be sent
ArrayList<NameValuePair> nameValuePairs;

//Create a HTTP Response and HTTP Entity
HttpResponse response;
HttpEntity entity;

//Create new default HTTPClient
httpclient = new DefaultHttpClient();

//Create new HTTP POST with URL to php file as parameter
httppost = new HttpPost("http://192.168.144.150/login/add.php");

String pass = md5(password);

//Next block of code needs to be surrounded by try/catch block for it to work
try {
    //Create new Array List
    nameValuePairs = new ArrayList<NameValuePair>();

    //place them in an array list
    nameValuePairs.add(new BasicNameValuePair("username", username));
    nameValuePairs.add(new BasicNameValuePair("password", pass));
    nameValuePairs.add(new BasicNameValuePair("database", database));

    //Add array list to http post
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

    //assign executed form container to response
    response = httpclient.execute(httppost);

    //check status code, need to check status code 200
    if(response.getStatusLine().getStatusCode()== 200){

        //assign response entity to http entity
        entity = response.getEntity();

        //check if entity is not null
        if(entity != null){


            //Create new input stream with received data assigned
            InputStream instream = entity.getContent();

            //Create new JSON Object. assign converted data as parameter.
            //JSONObject jsonResponse = new JSONObject(convertStreamToString(instream));
            JSONArray a = new JSONArray(convertStreamToString(instream));

            //assign json responses to local strings
            String res = a.getString(0);

            //Return the json response to the gui
            return res;

        } else {
            //Toast.makeText(this, "kapot", Toast.LENGTH_SHORT).show();
            return new String("De entiteit is leeg. Kortom: kapot");
        }


    } else {
        //Toast.makeText(this, "statuscode was niet 200", Toast.LENGTH_SHORT).show();
        return new String("De statuscode was niet 200.");
    }


} catch(Exception e){
    e.printStackTrace();
    //Display toast when there is a connection error
    //Change message to something more friendly
    //Toast.makeText(this, "verbindingsproblemem", Toast.LENGTH_SHORT).show();
    return new String("Er is een fout opgetreden. Controleer a.u.b. uw gegevens en de internetverbinding.");
}

不要介意荷兰语部分,这不重要。

【问题讨论】:

  • 你使用的是什么 Java JSON 库?
  • Java !== Javascript...你的意思是java还是javascript?
  • 我的意思当然是 Java,否则在我的问题中它会说 Javascript...
  • @HaroldHolsappel:没必要这么啰嗦,你不会相信有多少 JavaScript 问题被 OP 标记为 java。 :-) 而且由于您提到使用 PHP(因此服务器是 PHP),因此 Mark 更合理地怀疑您是否说错了(因为不清楚 Java 适合您的场景,如果服务器是 PHP) .另外:你能回答我上面的问题吗?
  • 啊,对不起。我正在使用 org.json 库。

标签: java php json


【解决方案1】:

json_encode("Success!") 的输出是"Success",它本身并不是一个有效的JSON document。有效 JSON 文档的顶级实体(根)必须是对象或数组。

如果你只想返回一个字符串,你可以这样做:

  1. 使其成为数组中的唯一条目:

    json_encode(array("Success!"))
    

    ...导致["Success!"],您可以在Java代码中像这样使用它(因为您说您正在使用org.java库):

    JSONArray a = new JSONArray(jsonStringFromPHP);
    String s = a.getString(0);
    

    当然

    String s = new JSONArray(jsonStringFromPHP).getString(0);
    
  2. 或者让它成为一个对象的唯一属性:

    json_encode(array('result' => "Success!")
    

    ...生成 {"result":"Success!"},您可以在 Java 代码中像这样使用它:

    JSONObject o = new JSONObject(jsonStringFromPHP);
    String s = o.getString("result");
    

当然

    String s = new JSONObject(jsonStringFromPHP).getString("result");

您可能可以使用JSONTokenizer 来读取您当前的 JSON 片段 ("Success!"),但我不建议这样做。坚持交换有效的 JSON 文档。

【讨论】:

  • 啊,我还需要使用 InputStream 进行 PHP 响应吗?
  • @HaroldHolsappel:什么InputStream?你没有在你的问题中提到一个,我也没有在我的回答中提到一个,所以我很困惑。 :-) JSONObjectJSONArrayJSONTokenizer 都乐于使用 String 作为输入(或 InputStream,无论哪种方式)。
  • 嗯,我想我会发布我的整个代码。请检查主要问题:)
  • @HaroldHolsappel:我没有使用过那个库,但假设你从HttpEntity 获得的InputStream 将在读取时返回 JSON 文档,JSONArray a = new JSONArray(instream); 应该可以工作(不需要用于首先将其转换为字符串的调用)——假设您已更改 PHP 以发送响应,如我在上面的选项 1 中列出的那样。如果它不起作用,则表明其他信息(标题?)正在作为流的一部分返回。
  • 它返回:org.json.JSONException: JSONArray initial value should be a string or collection or array.
【解决方案2】:

如果您必须在 Java 应用程序中通过密钥访问 JSON 数据,最好的办法是:

json_encode(array('message' => 'Success!'));

然后在 Java 中(根据您的示例代码):

jsonResponse.getString('message');

【讨论】:

  • 谢谢,现在试试。我得到:org.json.JSONException: A JSONObject text must begin with '{' at 1 [character 2 line 1] 后面是一个巨大的堆栈跟踪,我不会打扰你......
  • 好吧,json_encode(array('message' =&gt; 'Success!')); 会生成以“{”开头的 JSON 字符串 {"message":"Success!"}。不知道那里出了什么问题。
  • 我也没有。我进一步查看堆栈跟踪,错误实际上源于另一行代码:JSONObject jsonResponse = new JSONObject(convertStreamToString(instream));
【解决方案3】:

你不需要任何钥匙

在 PHP 中

json_encode("Succes!"); // returns "Succes!"  

在 Javascript 中 jquery

var obj = jQuery.parseJSON('"Succes!"');
alert(obj);

在Java中json-simple

Object obj = JSONValue.parse("\"Succes!\"");
System.out.println(obj);

编辑参考:@DaveRandom

JSON spec 要求将 JSON 包装在数组或对象中,如其所述:

| JSON 文本是一个序列化的对象或数组。

严格遵循规范的任何内容都不应仅接受“字符串”或数字文字或布尔文字(标量值) - 但我怀疑许多解析器会接受,因为解析器通常旨在原谅与标准的微小偏差.这很烦人,因为这意味着人们随后会毫无问题地偏离标准,并想知道为什么他们后来在使用更严格的实现时会遇到问题。

有一个论点是在这种情况下它应该返回 NULL,但是通过它的行为方式,您可以自己手动构造 JSON 字符串的一部分,并从 json_encode() 获取其他部分

...当然,你不应该/不会这样做,但你可以。

就像 XML 一样 - 没有根节点就不可能有一个有效的 XML 文档。它们都是为表示向量和复杂结构而设计的,假设如果你有简单/标量数据要传输,你可以直接传递它。

【讨论】:

  • 您的回答没有解决问题。现在您已经在最后添加了 Java 位,它至少模糊地接近于回答它。但是,OP 代码的根本问题是 JSON 不完整。 JSON 解析器完全没有义务将其拆分。
猜你喜欢
  • 2015-11-09
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多