使用jackson,spring,stomp设置反序列化嵌套JSON

问题描述 投票:1回答:2

在深入探讨该问题之前,我正在使用一个基于Spring Starter Guide gs-messaging-stomp-websocket的项目。根据指南,我正在使用Stomp和SockJS。话虽如此,我还添加了JPA逻辑,以允许从Web套接字接收更改后将其保留下来。我的问题是,我终于能够将序列化的jstree发送到后端,但是当遇到嵌套对象时,它无法反序列化它。这是来自前端的发送:

function sendNode() {
    //get rid of the leading and trailing [ ]s
    var coreTree = $("#treeStart").jstree(true).get_json('#', { 'flat': true });
    var stringifiedTree = JSON.stringify(coreTree);
    var sendableTree = stringifiedTree.substring(1, stringifiedTree.length-1);
    stompClient.send("/app/nodes", {}, sendableTree);
}

这是上面sendNode函数的输出:

{"id":"rootNode","text":"Root node 1","icon":true,"li_attr":{"id":"rootNode","class":"rootNode"},"a_attr":{"href":"#","id":"rootNode_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"#","type":"default"}

当前,我的Node类遵循此约定:

@Entity
public class Node { 
  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  private Long id_incr;

  @JsonProperty
  private String id;

  @JsonProperty
  private String text;

  @JsonProperty
  private String parent;

  @JsonProperty
  private String type;

  @JsonProperty
  private boolean icon;

  @JsonProperty
  private String[] li_attr;

  @JsonProperty
  private String[] a_attr;

  @JsonProperty 
  private String[] state;

  @JsonProperty
  private String[] data;

  private String[] nodeContents;

  protected Node(){ }
  public Node(String content){ }

  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  } 
  public String[] getNodeContents() {
    return this.nodeContents;
  } 
  public void setNodeContents(String[] nodeContents) {
    this.nodeContents = nodeContents;
  }

  public String getText() {
    return text;
  }
  public void setText(String text) {
    this.text = text;
  }
  public String getParent() {
    return parent;
  }
  public void setParent(String parent) {
    this.parent = parent;
  }
  public String getType() {
    return type;
  }
  public void setType(String type) {
    this.type = type;
  }
  public boolean isIcon() {
    return icon;
  }
  public void setIcon(boolean icon) {
    this.icon = icon;
  }
  public String[] getLi_attr() {
    return li_attr;
  }
  public void setLi_attr(String[] li_attr) {
    this.li_attr = li_attr;
  }
  public String[] getA_attr() {
    return a_attr;
  }
  public void setA_attr(String[] a_attr) {
    this.a_attr = a_attr;
  }
  public String[] getState() {
    return state;
  }
  public void setState(String[] state) {
    this.state = state;
  }
  public String[] getData() {
    return data;
  }
  public void setData(String[] data) {
    this.data = data;
  } 
}

我的控制器按原样返回响应:

@MessageMapping("/nodes")
@SendTo("/topic/nodes")
public String[] nodes(Node node) throws Exception {
    return node.getNodeContents();
}

这是我遇到问题的堆栈跟踪的一部分:

org.springframework.messaging.converter.MessageConversionException: Could not read JSON: Can not deserialize instance of java.lang.String[] out of START_OBJECT token
at [Source: [B@632d03de; line: 1, column: 50] (through reference chain: hello.Node["li_attr"])

我可能会误解,我对websocket和JSON序列化/反序列化还很陌生。预先谢谢您,如果您需要更多信息或描述,请告诉我!

json spring jstree stomp sockjs
2个回答
2
投票

我最近一周前遇到了同样的问题,我无法使用websocket sockjs stomp检索和发送对象。我建议通过实现Serializable来序列化您的Node对象。然后让我们看看会发生什么。

@Entity
public class Node implements Serializable{ 

  private static final long serialVersionUID = 1L;

  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  private Long id_incr;

  @JsonProperty
  private String id;

  @JsonProperty
  private String text;

  @JsonProperty
  private String parent;

  @JsonProperty
  private String type;

  @JsonProperty
  private boolean icon;

  @JsonProperty
  private String[] li_attr;

  @JsonProperty
  private String[] a_attr;

  @JsonProperty 
  private String[] state;

  @JsonProperty
  private String[] data;

  private String[] nodeContents;

  protected Node(){ }
  public Node(String content){ }

  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  } 
  public String[] getNodeContents() {
    return this.nodeContents;
  } 
  public void setNodeContents(String[] nodeContents) {
    this.nodeContents = nodeContents;
  }

  public String getText() {
    return text;
  }
  public void setText(String text) {
    this.text = text;
  }
  public String getParent() {
    return parent;
  }
  public void setParent(String parent) {
    this.parent = parent;
  }
  public String getType() {
    return type;
  }
  public void setType(String type) {
    this.type = type;
  }
  public boolean isIcon() {
    return icon;
  }
  public void setIcon(boolean icon) {
    this.icon = icon;
  }
  public String[] getLi_attr() {
    return li_attr;
  }
  public void setLi_attr(String[] li_attr) {
    this.li_attr = li_attr;
  }
  public String[] getA_attr() {
    return a_attr;
  }
  public void setA_attr(String[] a_attr) {
    this.a_attr = a_attr;
  }
  public String[] getState() {
    return state;
  }
  public void setState(String[] state) {
    this.state = state;
  }
  public String[] getData() {
    return data;
  }
  public void setData(String[] data) {
    this.data = data;
  } 
}

0
投票

请确保方法签名中的参数类具有空的构造函数。这对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.