2016-09-19 131 views
4

当我尝试解析JSON时,出现一个非常奇怪的错误。 有效地,该文件是非常简单和如下一个简单的对象组成:解析JSON时的问题

{ 
    "registered":false, 
    "firstname":"xxx", 
    "name":"yyyy", 
    "email":"[email protected]", 
    "picture":"xxxxx.jpg", 
    "username":"xxxy" 
} 

为了解析该文件中,我使用下面的代码,它是由在Android SDK的例子启发:

public static boolean isRegistered(int nmb) { 
    boolean toReturn = true; 
    JsonReader reader = null; 
    try { 
     reader = new JsonReader(new InputStreamReader(new URL("xxx").openConnection().getInputStream())); 
     reader.beginObject(); 
     while(reader.hasNext()) { 
      String name = reader.nextName(); 
      Log.i("Next value", name); 
      switch (name) { 
       case "registered": 
        toReturn = reader.nextBoolean(); 
        break; 
       case "firstname": 
        ProfileManager.getInstance().setFirstname(reader.nextString()); 
        break; 
       case "name": 
        ProfileManager.getInstance().setName(reader.nextString()); 
        break; 
       case "email": 
        break; 
       case "picture": 
        break; 
       case "username": 
        break; 
      } 
     } 
     reader.endObject(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      reader.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    return toReturn; 
} 

当我开始执行时,执行时会出现错误。

String name = reader.nextName(); 

该错误说,它期望一个名称,但它会得到一个STRING。可以肯定的是,我用nextString()替换nextName(),并且我得到了相反的错误:期望一个字符串,但是是NAME。我决定检查第一个值,这要感谢peek()方法,它清楚地表明第一个元素是一个NAME。所以我通过手动读取对象来尝试一个非常简单的事情,没有循环,它的工作原理。这怎么可能 ?此外,我必须修改哪些代码才能使此代码可行?

谢谢!

+2

为什么不使用GSON提供? – mariozawa

+0

不是答案。一个建议http://stackoverflow.com/a/18998203/3049065使用org.json库.. –

+0

我会说你的'switch'(包括默认)的所有情况下添加适当的处理。当前的实现在遇到“电子邮件”后会期望抛出异常 –

回答

5

尝试使用内置库通过Android SDK中

   JSONObject obj = new JSONObject(jsonString); 
       boolean registered = obj.getBoolean("registered"); 
       String firstname = obj.getString("firstname"); 
       String name = obj.getString("name"); 
       String email = obj.getString("email"); 
       String picture = obj.getString("picture"); 
       String username = obj.getString("username"); 
+0

完美地工作!谢谢:) – user1382272

+0

@ user1382272不客气:) –

0
public String CallUR(String url, int method) { 
    BufferedReader bufferedReader = null; 
    String result = null; 
    HttpURLConnection httpURLConnection = null; 
    /* Take an URL Object*/ 
    try { 
     URL url1 = new URL(url); 
     httpURLConnection = (HttpURLConnection) url1.openConnection(); 
     httpURLConnection.setRequestMethod("GET"); 
     httpURLConnection.setConnectTimeout(20000); 
     httpURLConnection.connect(); 

     InputStream inputStream = httpURLConnection.getInputStream(); 
     StringBuffer stringBuffer = new StringBuffer(); 

     if (inputStream == null) { 
      return null; 
     } 

     bufferedReader = new BufferedReader(new    InputStreamReader(inputStream)); 
     String line = ""; 
     while ((line = bufferedReader.readLine()) != null) { 
      stringBuffer.append(line + " "); 
     } 

     if (stringBuffer.length() == 0) { 
      return null; 
     } 
     /*Close Input Stream*/ 
     if (inputStream != null) 
      inputStream.close(); 

     result = stringBuffer.toString(); 
     return result; 
    } catch (MalformedURLException e) { 

     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (httpURLConnection != null) 
      httpURLConnection.disconnect(); 

     if (bufferedReader != null) 
      try { 
       bufferedReader.close(); 
      } catch (final Exception e) { 
      } 
    } 
    return result; 

} 



JSONObject jsonObject = new JSONObject(resultString); 

String registeredValue= jsonObject .getString("registered"); 
String firstnameValue= jsonObject .getString("firstname"); 
String nameValue= jsonObject .getString("name"); 
String emailValue= jsonObject .getString("email"); 
String pictureValue= jsonObject .getString("picture"); 
String usernameValue= jsonObject .getString("username"); 
0
**If you using java then ,you can create one bean** 

package com.example; 

import java.util.HashMap; 
import java.util.Map; 
import javax.annotation.Generated; 
import com.fasterxml.jackson.annotation.JsonAnyGetter; 
import com.fasterxml.jackson.annotation.JsonAnySetter; 
import com.fasterxml.jackson.annotation.JsonIgnore; 
import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.annotation.JsonPropertyOrder; 


public class Example { 

private Boolean registered; 

private String firstname; 

private String name; 

private String email; 

private String picture; 

private String username; 

/** 
* 
* @return 
* The registered 
*/ 

public Boolean getRegistered() { 
return registered; 
} 

/** 
* 
* @param registered 
* The registered 
*/ 
public void setRegistered(Boolean registered) { 
this.registered = registered; 
} 

/** 
* 
* @return 
* The firstname 
*/ 
public String getFirstname() { 
return firstname; 
} 

/** 
* 
* @param firstname 
* The firstname 
*/ 
public void setFirstname(String firstname) { 
this.firstname = firstname; 
} 

/** 
* 
* @return 
* The name 
*/ 
public String getName() { 
return name; 
} 

/** 
* 
* @param name 
* The name 
*/ 
public void setName(String name) { 
this.name = name; 
} 

/** 
* 
* @return 
* The email 
*/ 
public String getEmail() { 
return email; 
} 

/** 
* 
* @param email 
* The email 
*/ 
public void setEmail(String email) { 
this.email = email; 
} 

/** 
* 
* @return 
* The picture 
*/ 
public String getPicture() { 
return picture; 
} 

/** 
* 
* @param picture 
* The picture 
*/ 
public void setPicture(String picture) { 
this.picture = picture; 
} 

/** 
* 
* @return 
* The username 
*/ 
public String getUsername() { 
return username; 
} 

/** 
* 
* @param username 
* The username 
*/ 
public void setUsername(String username) { 
this.username = username; 
} 

} 

**Then after in the function you can pass the bean,Easily you can break it.** 

public void display(Example example){ 
String userName=example.getUsername(); 
... 
... 
} 
likewise you can do complete. 

If you don't want create the bean then you can directly use the JSON Object 

JSONObject obj = new JSONObject(jsonString); 

boolean registered = obj.getBoolean("registered"); 

String firstname = obj.getString("firstname"); 

String name = obj.getString("name"); 

String email = obj.getString("email"); 

String picture = obj.getString("picture"); 

String username = obj.getString("username"); 
+0

这对Java和Android都有用... –