4

I get a very weird error when I tried to parse a JSON. Effectively, the file is very simple and composed of a simple object as follow :

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

To parse this file, I used the following code, which is inspired by the example of the 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;
}

When I start the execution, I get an error rising when performing.

String name = reader.nextName();

The error said that it expects a name but it gets a STRING. To be sure, I replace nextName() by nextString() and I obtained the opposite error : Expected a String but was NAME. I decide to check the first value thanks to the peek() method, and it clearly says that the first element is a NAME. So I tried a very simple thing by reading the object manually, without the loop and it works. How is it possible ? Furthermore, what do I have to modify to make this code workable ?

Thank you !

3
  • 2
    Why not use GSON? Commented Sep 19, 2016 at 11:42
  • Not an answer. One suggestion stackoverflow.com/a/18998203/3049065 using org.json library.. Commented Sep 19, 2016 at 11:43
  • I'd say add proper handling for all cases in your switch (including a default). Current implementation would expect to throw an exception after it encounters "email" Commented Sep 19, 2016 at 11:47

3 Answers 3

5

try using inbuilt library provided by 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");
Sign up to request clarification or add additional context in comments.

1 Comment

Works perfectly ! Thank you :)
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");

Comments

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");

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.