2

我有一个使用 JSON 通过 PHP 脚本与 SQL 数据库通信的 Java 应用程序。我之前使用 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.");
}

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

4

3 回答 3

2

你不需要任何钥匙

在 PHP 中

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

在 Javascript jQuery中

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

在 Java中简单的 json

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

编辑参考:@DaveRandom

JSON 规范要求 JSON 包装在数组或对象中,因为它指出:

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

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

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

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

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

于 2012-10-30T10:14:12.097 回答
2

json_encode("Success!")is的输出"Success",它本身并不是一个有效的JSON 文档。有效 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 文档。

于 2012-10-30T10:15:39.413 回答
2

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

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

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

jsonResponse.getString('message');
于 2012-10-30T10:17:02.127 回答