2

JSON を使用して、PHP スクリプトを介して SQL データベースと通信する Java アプリケーションがあります。以前に JSON を使用して配列を json_encode しましたが、これは正常に機能し、各エントリのキーを使用して Java で値を呼び出すことができます。しかし今、私は PHP で文字列を json_encoded しました json_encode("Succes!");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-simple

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!")あり"Success"、それ自体は有効なJSON ドキュメントではありません。有効な JSON ドキュメントの最上位エンティティ (ルート) は、オブジェクトまたは配列である必要があります。

1 つの文字列だけを返したい場合は、次のようにします。

  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 に答える