Skip to content

When flatten = true, Jackson2HashMapper serializes the List and deserializes it out of order #2565

Closed
@ainydexiaohai

Description

@ainydexiaohai

Hi,
When I tried to serialize an object containing the List attribute, I deserialized it to obtain a disordered List.

1.Problem

Test.class

Jackson2HashMapper jackson2HashMapper = new Jackson2HashMapper(true);
List<Integer> list = IntStream.range(0, 20).boxed().collect(Collectors.toList());
User user = new User();
user.setUserAgeList(list);
System.out.println("before serialize, user=" + user);
Map<String, Object> map = jackson2HashMapper.toHash(user);
User user1 = (User)jackson2HashMapper.fromHash(map);
System.out.println("after serialize, user=" + user1);

User.class

@Data
public class User {
    private List<Integer> userAgeList;
}

result:

before serialize, user=User(userAgeList=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
after serialize, user=User(userAgeList=[0, 1, 18, 3, 4, 2, 19, 7, 8, 5, 6, 9, 12, 13, 10, 11, 14, 15, 16, 17])

2.Reason

org.springframework.data.redis.hash.Jackson2HashMapper#flattenMap use HashMap to store elements.

private Map<String, Object> flattenMap(Iterator<Entry<String, JsonNode>> source) {
	Map<String, Object> resultMap = new HashMap();
	this.doFlatten("", source, resultMap);
	return resultMap;
}

3.Solution

Modify the storage set to LinkedHashMap.

private Map<String, Object> flattenMap(Iterator<Entry<String, JsonNode>> source) {
	Map<String, Object> resultMap = new LinkedHashMap();
	this.doFlatten("", source, resultMap);
	return resultMap;
}

Thanks in advance!

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions