【问题标题】:Cannot deserialize object with gson.fromJson无法使用 gson.fromJson 反序列化对象
【发布时间】:2015-09-29 19:22:43
【问题描述】:

我正在尝试使用 gson.fromJson 反序列化由邮递员发送的对象。

 @POST
    @Path( "company" ) // takes name as a path parameter
    @Produces( "application/json" ) // response formatted as JSON
    public Response insertCompany(String content) {
        Gson gson = new Gson();
        CompanyWithNoIdReturn newCompany = gson.fromJson(content,  CompanyWithNoIdReturn.class);
   }

public class CompanyWithNoIdReturn {

     private final String name;
     private final String description;
     private final String logo;

    public CompanyWithNoIdReturn(String name, String description, String logo) 
    {
        this.name = name;
        this.description = description;
        this.logo = logo;
    }

    public String getName() {

        return name;
    }

    public String getDescription() {

        return description;
    }

    public String getLogo() {

        return logo;
    }

}

出现的错误是:javax.servlet.ServletException:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:应为 BEGIN_OBJECT 但为 STRING 在第 1 行第 1 列

我理解这意味着它希望它以{ 开头,而不是" 中提到的here。虽然我不明白我该如何解决它?

json 是这样构造的:

编辑:使用 form - data 时,内容类似于:

content = (java.lang.String) "------WebKitFormBoundaryUG5yy1gW9G2V5qcz
Content-Disposition: form-data; name="CompanyName"

newCompanyName2
------WebKitFormBoundaryUG5yy1gW9G2V5qcz
Content-Disposition: form-data; name="Description"

newDescription2
------WebKitFormBoundaryUG5yy1gW9G2V5qcz
Content-Disposition: form-data; name="logo"

newLogo2
------WebKitFormBoundaryUG5yy1gW9G2V5qcz--
"

【问题讨论】:

  • 你的输入 JSON 在哪里?
  • @Amila 我添加了邮递员的图片\

标签: java json gson


【解决方案1】:

我认为您期望 JSON 格式的正文(内容变量)。但是根据您的邮递员形象,您正在发送form-data

尝试切换到raw 并插入:

{
    "name": "Company name",
    "description": "Company description",
    "logo": "logo"
}

【讨论】:

  • 你是对的。它工作正常。虽然如果我希望它与 form - data 或 xxx-www-form-urlencoded 一起使用,该怎么做?
  • 如果您使用的是框架,则需要查看文档。它应该有它的类。但我不知道你在用什么,也不能推荐任何东西。但是在form-data 的情况下,您的content 应该类似于“name=a&description=b&logo=c”,您可以使用String 类对其进行解析。
  • 虽然我不明白,但我没有使用任何框架。如果我在最初的问题中使用代码,则会产生错误,因为它需要一个对象而不是字符串。你能像我在最初的问题中写的那样编写处理数据的代码吗?
  • 发布content 变量的值
【解决方案2】:

如果您想使用 JaxRs 服务处理表单数据,您应该查看@FormParam。你的服务会变成

@POST
@Path( "company" ) // takes name as a path parameter
@Produces( "application/json" ) // response formatted as JSON
public Response insertCompany(@FormParam("CompanyName") String name, @FormParam("Description") String description, @FormParam("Logo") String logo) ) {
    CompanyWithNoIdReturn newCompany = new CompanyWithNoIdReturn(name, description, logo);
    return Response.ok(newCompany).build();
}

您必须确保在 FormParam 注释中指定的名称与表单中的字段名称匹配。

【讨论】:

    猜你喜欢
    • 2013-11-14
    • 2016-12-30
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 2014-08-04
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多