Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

java-2.0.4版本不支持双向链表的json字符串转实体类,双向链表转json会有问题 #377

Closed
javalipf opened this issue May 29, 2022 · 2 comments
Labels
bug Something isn't working
Milestone

Comments

@javalipf
Copy link

javalipf commented May 29, 2022

`@Data
public class ApproveConfigJson implements Serializable {
private String postId;

private boolean hasPreNode = false;

private ApproveConfigJson preNode;

private boolean hasNextNode = false;

private ApproveConfigJson nextNode;

}`

json字符串 {"hasNextNode":true,"hasPreNode":false,"jump":true,"nextNode":{"hasNextNode":true,"hasPreNode":true,"jump":true,"nextNode":{"hasNextNode":false,"hasPreNode":true,"jump":true,"passType":1,"postId":"8422e7b960781225747439c620cd0919","preNode":{"$ref":".."},"sort":3},"passType":1,"postId":"1e1e159ad5f8293124208207aa4b76b1","preNode":{"$ref":".."},"sort":2},"passType":1,"postId":"b68aac95774a9682aeddb9a2d15a0c38","preNode":{"hasNextNode":false,"hasPreNode":false,"jump":false,"sort":0},"sort":1}

使用JSON.parseObject(str, ApproveConfigJson.class);方法生成的ApproveConfigJson,在链表第二级节点及之后,无法正确追踪到前一级节点,而这在1.2.78版本是可用的
另外双向链表结构转json字符串的过程会栈内存溢出
1 2 78
2 0 4

@javalipf javalipf added the bug Something isn't working label May 29, 2022
@javalipf javalipf changed the title java-2.0.4版本不支持双向链表的json字符串转实体类,会有问题 java-2.0.4版本不支持双向链表的json字符串转实体类,双向链表转json会有问题 May 29, 2022
@javalipf
Copy link
Author

2.0.5版本,双向链表向Json序列化可用,但是序列化产生的数据反序列化节点存在问题,如下
`@Data
@NoArgsConstructor
@AllArgsConstructor
public class ApproveConfigJson implements Serializable {
private String postId;

private boolean hasPreNode = false;

private ApproveConfigJson preNode;

private boolean hasNextNode = false;

private ApproveConfigJson nextNode;

private int sort;

public ApproveConfigJson(String postId, int sort) {
    this.postId = postId;
    this.sort = sort;
}

}
public static void main(String[] args) {
List approveConfigJsons = new ArrayList<>();
approveConfigJsons.add(new ApproveConfigJson("1",1));
approveConfigJsons.add(new ApproveConfigJson("2",2));
approveConfigJsons.add(new ApproveConfigJson("3",3));
String s = list2LinkedJson2(approveConfigJsons);
ApproveConfigJson approveConfigJson = JSON.parseObject(s, ApproveConfigJson.class);
System.err.println(approveConfigJson.getNextNode().getPreNode().getPostId());
}

public static String list2LinkedJson2(List<ApproveConfigJson> approveConfigJsons) {
    approveConfigJsons = approveConfigJsons.stream().sorted(Comparator.comparing(ApproveConfigJson::getSort)).collect(Collectors.toList());
    ApproveConfigJson approveUtil = null;
    Iterator<ApproveConfigJson> iterator = approveConfigJsons.iterator();
    ApproveConfigJson local = new ApproveConfigJson();
    while (iterator.hasNext()) {
        ApproveConfigJson next = iterator.next();
        if (approveUtil == null) {
            approveUtil = next;
            local = next;
        } else {
            approveUtil.setHasNextNode(true);
            approveUtil.setNextNode(next);
            next.setHasPreNode(true);
            next.setPreNode(local);
            local = next;
            approveUtil = approveUtil.getNextNode();
            approveUtil.setNextNode(null);
        }
    }

    ApproveConfigJson finalNode = approveUtil;
    while (finalNode.isHasPreNode()) {
        finalNode = finalNode.getPreNode();
    }
    return JSON.toJSONString(finalNode);
}`

按照sort排序,链表首节点为postId = 1,序列化的json串正常,但是反序列化后链表的首节点为postId = 2,且获取下级节点后再获取上级节点会出现java.lang.NullPointerException
在 ApproveConfigJson approveConfigJson = JSON.parseObject(s, ApproveConfigJson.class);方法中

@wenshao wenshao added this to the 2.0.6 milestone May 29, 2022
@wenshao
Copy link
Member

wenshao commented Jun 4, 2022

https://github.com/alibaba/fastjson2/releases/tag/2.0.6
问题已经修复,请用新版本

@wenshao wenshao closed this as completed Jun 4, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants