2012-02-06 78 views
1

我有一个应用程序,应该显示一个字符串在按钮点击后,在textview中,而是显示JSON格式的代码而不是未编码的JSON。这里是我的Android代码将JSON转换为来自sql数据库的字符串由php

package game.com; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class JSONtestActivity extends Activity { 

String result = ""; 
InputStream is = null; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button btn = (Button) findViewById(R.id.button1); 
    btn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      TextView one = (TextView) findViewById(R.id.textView1); 

      returnJson(); 

     //end of onClick  
     } 
    //end of onClickListener 
    }); 


//end of oncreate()  
} 

public void returnJson(){ 

    TextView one = (TextView) findViewById(R.id.textView1); 

    try{ 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new  HttpPost("http://10.0.2.2/textures_story_list.php"); 

      HttpResponse response = httpClient.execute(httpPost); 
      HttpEntity entity = response.getEntity(); 
      is = entity.getContent(); 

    }catch(Exception e) { 
     one.setText("error3"); 
    } 

    try{ 


     BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"), 8);      
     StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "/n"); 
      } 
      is.close(); 
      result = sb.toString(); 

    }catch(Exception e) { 
     one.setText("error2");   
     } 

    try{ 
     JSONArray jArray = new JSONArray(result); 
     for(int i = 0;i<jArray.length();i++){ 
      JSONObject json_data = jArray.getJSONObject(i); 
      Log.i("log_tag","story_name: "+json_data.getString("story_name") 
        ); 
      result += "\n" + jArray.getJSONObject(i); 



     } 
     one.setText(result); 
    } 
    catch(JSONException e) { 
     one.setText("error1"); 
    } 
     return; 


//end of returnJson() 
} 



//end of class body  
} 

和我的PHP

<?php 
mysql_connect("127.0.0.1","root"); 
mysql_select_db("textures_story_list"); 
$sql=mysql_query("SELECT story_name FROM story_list WHERE story_name LIKE 'sto%'"); 
while($row=mysql_fetch_assoc($sql)) $output[]=$row; 
print(json_encode($output)); 
mysql_close(); 
?> 

有人可以为Y帮助它不显示名称,而不是JSON格式 这是它显示在TextView的,而不是故事,一个,故事两等

[{"story_name":"Story One"} 
{"story_name":"Story Two"}, 
{"story_name":"Story Three"}, 
{"story_name":"Story Four"}, 
{"story_name":"Story Five"}, 
{"story_name":"Story Six"}]/n{"story_name":"Story One"}, 
{"story_name":"Story Two"}, 
{"story_name":"Story Three"}, 
{"story_name":"Story Four"}, 
{"story_name":"Story Five"}, 
{"story_name":"Story Six"} 
+0

让我直截了当地看到:在打印之前,您在检索到的记录上使用了json_encode(),然后想知道为什么字符串显示为json编码? – 2012-02-06 07:22:43

+0

是否日志条目Log.i(“log_tag”,“story_name”'...显示正确的字符串值或它表现出相同的问题? – 2012-02-06 07:49:06

+0

是的我编码它在PHP到JSON然后发送到Android与httppost并需要现在解码到正常的英语,但不知道如何做到这一点,任何帮助将不胜感激 – daniel 2012-02-06 08:19:06

回答

1

我可能是太传道的,但每次谈到在java中解析字符串对象的时候,我建议使用Gson library。它是轻量级的,在Android上也可以很好地工作。对于您的具体情况,您可能会自己解析字符串,但是因为我认为这不是您需要解析json的唯一地方,所以图书馆可能会帮助您。这里是我的建议:

申报该JSON将deserialzied类:

import com.google.gson.annotations.SerializedName; 
public class Story { 
    @SerializedName(story_name) 
    private String storyName; 
} 

然后反序列化字符串这个类:

Gson gson = new Gson(); 
Story [] stories = gson.fromJson(is, Story[].class); 

从此你可以遍历这个对象数组并使用它,但是你喜欢。

夫妇的笔记

  • 的 '\ n' 写入\ n不是/ N。
  • 记录是绝对需要知道您是否编码为Android的 。基本上你只写Log.i("Log tag", "My first log message");Log是android为你提供的一个类(你当然还需要导入它 )。 i是日志级别可以 e(错误),w(警告) Log tag只是一个字符串,基本上你可以放置任何你喜欢的地方 那里 - 我会建议类名。最后当这条线是 执行,你会看到你的LogCat My first log message。日志记录 对于检测cod中的问题非常有用,因为您可以在程序的某些位置显示变量值。
+0

boris,帮助了很多人不舒服地尝试gson,看看这是怎么回事,即时通讯只是新的android,但快速采摘它,再次感谢您的帮助 – daniel 2012-02-06 10:00:33