无法从 json 字符串实例化类型的值

Posted

技术标签:

【中文标题】无法从 json 字符串实例化类型的值【英文标题】:Can not instantiate value of type from json string 【发布时间】:2014-09-18 21:39:06 【问题描述】:

我在用户和组之间有双向多对多关系。

    @Entity
    @Table(name = "UserTBL")
    public class User 

    @Id
    @SequenceGenerator(name = "user_generator", sequenceName = "user_seq", allocationSize = 1, initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_generator")
    private Long id;

    private String username;

    private String password;

    @ManyToMany
    private List<Group> groups;



@Entity
@Table(name = "GroupTBL")
public class Group 

    @Id
    @SequenceGenerator(name = "Group_generator", sequenceName = "group_seq", allocationSize = 1, initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Group_generator")
    private Long id;

    private String name;

    private String description;

    @ManyToMany(mappedBy = "groups")
    private List<User> users;

我正在使用 java jax-rs web 服务开发 angular js 应用程序,我正在使用 jackson 处理 json 绑定,但我遇到了这个异常:

无法从 JSON String 实例化类型 [simple type, class com.blog.models.Group] 的值;没有单字符串构造函数/工厂方法(通过引用链:com.blog.models.User["groups"])

这是我发送到服务器的 json 对象:

  
   "groups":[  
      "\"id\":1,\"name\":\"admin\",\"description\":null,\"users\":[]",
      "\"id\":2,\"name\":\"user\",\"description\":null,\"users\":[]"
   ],
   "username":"hussien",
   "password":"ammar"

资源:

@Stateless
@Path("/users")
public class UserResource 

    @EJB
    private UserFacade userFacade;

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public void createUser(User user) 
        userFacade.create(user);
    

【问题讨论】:

【参考方案1】:

看起来在客户端您可能会将 JSON 对象字符串化两次(组)。你应该只调用一次。 JSON应该是这样过来的:

"groups":[
"id":1,"name":"admin","description":null,"users":[],
"id":2,"name":"user","description":null,"users":[]
],
"username":"hussien",
"password":"ammar"

【讨论】:

我使用高级rest客户端chrome扩展对其进行了测试,出现了同样的异常 你的答案对我有用,但我很困惑为什么我的 json 无效,尽管它是有效的 这是有效的 JSON,但不是您的应用所期望的 JSON。这将映射为List&lt;String&gt;,其中第一个条目是那里的第一个字符串,第二个是第二个值。 终于!!!我已经处理了 4 个小时的问题,首先我的控制器没有被调用,然后我将其更改为接收 LinkedHashMap 而不是我的 POJO,但我无法使用 ObjectMapper 自己映射它......这一切都是由我的 JS 对象被字符串化了两次。谢谢!

以上是关于无法从 json 字符串实例化类型的值的主要内容,如果未能解决你的问题,请参考以下文章

无法从 JSON 字符串实例化类型值;没有单字符串构造函数/工厂方法

Jackson ObjectMapper 无法反序列化 POJO,抛出异常:没有找到适合类型 [...] 的构造函数:无法从 JSON 对象实例化

反序列化的改造/杰克逊错误

无法从字符串获取 JSON

您可以在 .NET 中从 JSON 实例化对象实例吗?

无法实例化类型 Set