Java 字符串到JSON(android)
我陷入了一个非常棘手的境地。所以,我要做的是从本地主机数据库获取JSON对象。当我在浏览器中输入url()时,它会回显:Java 字符串到JSON(android),java,android,json,eclipse,jsonobject,Java,Android,Json,Eclipse,Jsonobject,我陷入了一个非常棘手的境地。所以,我要做的是从本地主机数据库获取JSON对象。当我在浏览器中输入url()时,它会回显: { "nr": "1", "pav": "MANTAS" } 我已经检查了这个JSON,它似乎是有效的。此外,我几乎花了一整天的时间在StackOverflow中寻找解决方案,但没有一个有效。这是我的代码: public class MainScreenActivity extends Activity implements OnClickListene
{
"nr": "1",
"pav": "MANTAS"
}
我已经检查了这个JSON,它似乎是有效的。此外,我几乎花了一整天的时间在StackOverflow中寻找解决方案,但没有一个有效。这是我的代码:
public class MainScreenActivity extends Activity implements OnClickListener {
EditText laukas;
Button mygtukas;
InputStream is = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_screen);
laukas = (EditText)findViewById(R.id.editText1);
mygtukas = (Button)findViewById(R.id.button1);
mygtukas.setOnClickListener(this);
}
@Override
public void onClick(View v){
String lokacija = "http://localhost./embrace/test_get.php?nr=1"; /* dont be mad about localhost, i have working adress which i've tested via pc and android browser, it's just because stackoverflow policy */
URL url = null;
try {
url = new URL(lokacija);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
Log.d("KLAIDA",e.toString());
}
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) url.openConnection();
} catch (IOException e) {
// TODO Auto-generated catch block
Log.d("KLAIDA",e.toString());
}
try {
conn.setRequestMethod("GET");
} catch (ProtocolException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
conn.setDoInput(true);
try {
conn.connect();
} catch (IOException e) {
// TODO Auto-generated catch block
Log.d("KLAIDA",e.toString());
}
try {
is = conn.getInputStream();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String contentAsString = null;
try {
contentAsString = readIt(is, 500);
//is.close();
if(contentAsString != null){
//textView.setText(contentAsString);
} //else textView.setText("nuliukas");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
Log.d("KLAIDA",e.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
Log.d("KLAIDA",e.toString());
}
conn.disconnect();
int sum = 0;
for(int i =0;i<contentAsString.length();i++){
if(contentAsString.charAt(i)==('"'))
sum++;
}
try {
JSONObject b = new JSONObject();
b.getJSONObject(contentAsString); // CRASH HERE
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Toast.makeText(MainScreenActivity.this,sum+"",Toast.LENGTH_SHORT).show();
}
public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
Reader reader = null;
reader = new InputStreamReader(stream, "UTF-8");
char[] buffer = new char[len];
reader.read(buffer);
return new String(buffer);
}
}
我已经试过了:
要更正接收到的字符串结尾,请删除/n标记;
为了使用稍有不同的方法,但LogCat在输入的结尾处抛出了字符0,我还尝试记录我的输出(从HTTP接收的字符串,和从浏览器接收的字符串相同(漂亮的JSON字符串));
所以,正如你所看到的,我已经尝试了很多,但似乎每个可能的解决方案都有问题。提前感谢:)
解决了!!!
特别感谢jteezy14!
这并不像他所说的那样是个问题,但事实上他引导我走上了正确的道路。
应该是:
JSONObject b=null;
try {
b = new JSONObject(naujas);
} catch (JSONException e1) {
// TODO Auto-generated catch block
Log.e("JSONKE",e1.toString());
}
而不是:
JSONObject b = new JSONObject();
try{
b.getJSONObject(naujas);
} catch (JSONException e1) {
Log.e("JSONKE",e1.toString());
}
另外,感谢Kimmax对我的答案进行格式化,使其更易于理解;) 发生这种情况的原因是,您正在readIt()函数中创建一个500个字符长的字符串。您的JSON表达式{“nr”:“1”,“pav”:“MANTAS”}是有效的,但有尾随字符使其成为无效的JSON。这就是为什么在logcat中,JSON表达式后面会有这么多问号 为了解决这个问题,您需要从JSON字符串中删除额外的字符 编辑(阅读您的评论后): 我的答案的第一部分是必要的,但您也必须以不同的方式使用JSONObject。看一下Android JSONObject的文档 您正在使用的函数期望输入值是JSON对象的键(这就是为什么您会得到一个表示没有值的错误,因为您正在指定一个不存在的键)。您需要创建传递字符串的对象,然后获取值:
JSONObject b = new JSONObject(contentAsString)
JSONObject valAtNr = b.getJSONObject("nr"); //value at nr
JSONObject valAtPav = b.getJSONObject("pav"); //value at pav
我认为您应该尝试使用GSON库为您解析JSON字符串。这是。第二个答案将提供一个很好的例子。不幸的是,它不起作用。。我删掉了这些不必要的字符。此外,还检查了“修改字符串”和“未修改字符串”的长度,它们分别为25和500。但我仍然得到错误:{“nr”:“1”,“pav”:“MANTAS”}没有值
JSONObject b = new JSONObject();
try{
b.getJSONObject(naujas);
} catch (JSONException e1) {
Log.e("JSONKE",e1.toString());
}
JSONObject b = new JSONObject(contentAsString)
JSONObject valAtNr = b.getJSONObject("nr"); //value at nr
JSONObject valAtPav = b.getJSONObject("pav"); //value at pav