Java JSON问题:can';无法获取所需数据,故障一直在发生
我之前问了一个关于解析json的问题,从那以后我发现了一个应该可以正常工作但不能正常工作的示例。我现在拥有的代码如下:Java JSON问题:can';无法获取所需数据,故障一直在发生,java,android,json,Java,Android,Json,我之前问了一个关于解析json的问题,从那以后我发现了一个应该可以正常工作但不能正常工作的示例。我现在拥有的代码如下: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final TextView tv = (TextView)findViewById(R.i
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final TextView tv = (TextView)findViewById(R.id.result);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
String username = "exampleusername";
String password = "examplepassword";
String url = "http://www.example.com/api/core/v1/my/";
String unp = username+":"+password;
class MyUser {
public String firstName;
public String lastName;
}
try {
HttpClient client = new DefaultHttpClient();
HttpGet header = new HttpGet(url);
String encoded_login = Base64.encodeToString(unp.getBytes(), Base64.NO_WRAP);
header.setHeader(new BasicHeader("Authorization", "Basic "+encoded_login));
HttpResponse response = client.execute(header);
HttpEntity entity = response.getEntity();
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
for (String line; (line = reader.readLine()) != null;) {
if (line.isEmpty()) break; // Stop when headers are completed. We're not interested in all the HTML.
final String newjson = line.replaceAll("throw 'allowIllegalResourceCall is false.';", "");
JSONObject mainObject = new JSONObject(newjson);
JSONObject uniObject = mainObject.getJSONObject("firstName");
// System.out.println(newjson + newjson.contains("firstName") + "," + newjson.contains("lastName"));
System.out.println(uniObject);
// System.out.println(uniURL);
}
{
"enabled" : true,
"email" : "example@gmail.com",
"firstName" : "example firstname",
"lastName" : "example lastname",
"name" : "example fullname",
"level" : {
使用此代码,我现在得到以下错误:
W/System.err(910): org.json.JSONException: End of input at character 0 of
W/System.err(910): at org.json.JSONTokener.syntaxError(JSONTokener.java:450)
W/System.err(910): at org.json.JSONTokener.nextValue(JSONTokener.java:97)
W/System.err(910): at org.json.JSONObject.<init>(JSONObject.java:154)
W/System.err(910): at org.json.JSONObject.<init>(JSONObject.java:171)
W/System.err(910): at basic.authentication.BasicAuthenticationActivity.onCreate(BasicAuthenticationActivity.java:84)
W/System.err(910): at android.app.Activity.performCreate(Activity.java:4465)
W/System.err(910): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
W/System.err(910): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
W/System.err(910): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
W/System.err(910): at android.app.ActivityThread.access$600(ActivityThread.java:123)
W/System.err(910): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
W/System.err(910): at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err(910): at android.os.Looper.loop(Looper.java:137)
W/System.err(910): at android.app.ActivityThread.main(ActivityThread.java:4424)
W/System.err(910): at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(910): at java.lang.reflect.Method.invoke(Method.java:511)
W/System.err(910): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
W/System.err(910): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
W/System.err(910): at dalvik.system.NativeStart.main(Native Method)
我现在对json感到非常困惑,为什么它不起作用您可能想尝试编写没有空格的json 例如
{"foo":"bar"}
而不是
{
"foo":"bar"
}
试试这个读取功能
public static JSONObject read(String url, String unp){
System.out.println("Connecting to service URL : "+url);
InputStream is = null;
String result = "";
// http post
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
String encoded_login = Base64.encodeToString(unp.getBytes(), Base64.NO_WRAP);
httppost.setHeader(new BasicHeader("Authorization", "Basic "+encoded_login));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch (Exception e) {
e.printStackTrace();
}
// convert response to string
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) {
e.printStackTrace();
}
JSONObject json = null;
try {
json = new JSONObject(result);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return json;
}
}
- 在这里,我首先连接到服务
- 下载响应
- 将其传递给JSONObject创建,而不是在循环中进行
jsonObject
保存在for
循环中?甚至不需要添加System.out.println(newjson);然后再运行一次。看起来你在那里,但评论了出来。我猜这个回答有问题。也可用于验证JSON。这在向下拉取数据时起作用,但在字符串“result”被传递到JSONObject的部分,它返回一个错误W/System.err(960):org.JSON.JSONException:java.lang.string类型的值抛出无法转换为JSONObject。问题是否已解决?或者此注释是在您将其标记为答案之前完成的?通常,当来自服务器的响应字符串包含(或以)一些非json格式的字符串时,会发生此错误。在将响应字符串传递给JSONObject之前打印它,并确认它是正确的。很抱歉,过去两天没有在这里打开,我在解决它之前发布了这个。您提供的解决方案非常好,只是需要一些调整,但我成功地将数据拉下来:)。谢谢