Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GSON - JsonSyntaxException - Expected name at line 7 column 4

I have the following result class whose object is to be returned as JSON.

public class Result {
    public String objectid;
    public String dtype;
    public String type;
    public String name;
    public String description;

    public Result() {
        this.objectid = "";
        this.dtype= "";
        this.type="";
        this.name= "";
        this.description = "";
    }

    public String getObjectid() {
        return objectid;
    }

    public void setObjectid(String s) {
        this.objectid = s;
    }

    public String getDtype() {
        return dtype;
    }

    public void setDtype(String s) {
        this.dtype= s;
    }

    public String getType() {
        return type;
    }

    public void setType(String s) {
        this.type = s;
    }

    public String getName() {
        return name;
    }

    public void setName(String s) {
        this.name = s;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String s) {
        this.description = s;
    }

}

I have a configuration json which is read my the main .java and returned as json as HTTP RESPONSE. It is as below:

{
        "objectid" : "test",
        "dtype" : "test",
        "type" : "test",
        "name" : "test",
        "description" : "test" // removed
},
{
        "objectid" : "test",
        "dtype" : "test",
        "type" : "test",
        "name" : "test",
        "description" : "test"
}

Main .java

Using Gson, it reads the configuration.json file and has to return a json.

My code:

Gson g = new Gson();
Result r = g.fromJson(res.toString(), Result.class);

where res.toString() gets me the configuration.json file content as string.

My problem:

I am experiencing the following exception:

Exception com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 7 column 3
com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 7 column 3

Any pointers?

like image 641
Namenoobie Avatar asked Jul 25 '13 15:07

Namenoobie


3 Answers

If this is the actual json: You have an extra comma here and a spelling error. The error says you have bad json syntax. So this is probably one of the first places to look.

{
            "objectid" : "test",
            "dtype" : "test",
            "type" : "test",
            "name " : "test",
            "description" : "test", //delete this comma
            },
            {
            "objectid" : "test",
            "dtyoe" : "test",  // spelling error
            "type" : "test",
            "name " : "test",
            "description" : "test"
    }

You also seem to be parsing two objects and telling gson you want one result object from it. Consider either parsing the objects separately or tell gson you want a result array Back

like image 152
CBIII Avatar answered Nov 13 '22 23:11

CBIII


use

catch(JsonSyntaxException e)

instead of

catch(MalformedJsonException e)

because MalformedJsonException is some internal exception while JsonSyntaxException is the one that actually get thrown. here is a code snippet

            String response="Something";
            JsonElement my_json;
            try {
                my_json=jsonParser.parse(response);
            } catch(JsonSyntaxException e) {
                e.printStackTrace();
                JsonReader reader = new JsonReader(new StringReader(response));
                reader.setLenient(true);
                my_json=jsonParser.parse(reader);
            }
like image 27
Muayyad Alsadi Avatar answered Nov 13 '22 23:11

Muayyad Alsadi


You have two objects but getting one object from GSON. either you should use below format of JSON string to get Result object from this JSON string.

{
    "objectid" : "test",
    "dtype" : "test",
    "type" : "test",
    "name" : "test",
    "description" : "test" 

}

Second option :-

You will have to change JSON string format. you will have to change it in JSON array and get ArrayList of this object, After that, we can get Result object using array list index.new JSON string would be like this.

    {"resultArray":[{
    "objectid" : "test",
    "dtype" : "test",
    "type" : "test",
    "name" : "test",
    "description" : "test" 
           },
      {
    "objectid" : "test",
    "dtype" : "test",
    "type" : "test",
    "name" : "test",
    "description" : "test"
        }]}

And java code to fetch Result Object.

Gson g = new Gson();
ResultList r = g.fromJson(res.toString(), ResultList.class);
ArrayList<Result> resultList = r.getResultList();
       for(int x=0 ;x<resultList.size();x++){
              Result result = resultList.get(x);
              }

ResultList Model is:-

public class ResultList {
@SerializedName("resultArray")
public ArrayList<Result> resultList;
public getResultList(){
          return resultList;
           } 
       }

@Note: - Result.java would be used same as given above.

like image 44
Ashish Saini Avatar answered Nov 13 '22 23:11

Ashish Saini