GSON - JsonSyntaxException - Expected name at line 7 column 4

末鹿安然 提交于 2020-01-22 17:50:06

问题


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?


回答1:


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




回答2:


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



回答3:


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.



来源:https://stackoverflow.com/questions/17862689/gson-jsonsyntaxexception-expected-name-at-line-7-column-4

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!