우리 개발 팀의 jackson과 몇 가지 문제가 있습니다.
중요하지 않은 맥락 우리는 jackson을 처음 접했고 과거에 몇 가지 문제가 있었지만 항상 인터넷을 통해 얻은 문제와 StackOverflow를 통해 해결 된 과거 문제로 문제를 해결하려고 노력했습니다.
유용한 정보 우리는 자바 인스턴스 객체를 JSON으로 파싱하여 redis를 통해 문자열로 보낸 다음 pub / sub 시스템을 통해 다른 쪽 끝에서 원래 유형의 객체로 다시 가져올 수 있습니다.
각각 다른 객체를 나타내는 2 개의 필드가 있습니다.
Data: a ChannelMessage object.
String senderName, message;
Enum:ServerType serverType;
Metadata: a RedisMetadata object.
String id, channelName, serverId;
Enum:MessageType type;
따라서 JSON은 다음과 비슷해야합니다.
{
"data": {
"senderName": "PixelDev1729",
"message": "asd",
"serverType": "HUB"
},
"metadata": {
"id": "1bba40f5-74ed-4ab8-ad81-83078ac11421",
"channelName": "global-chat",
"serverId": "b4409522-6a97-47f5-ad75-661ed86c52e8",
"type": "SEND"
}
}
몇 가지 골칫거리 우리는 객체에서 값을 문자열로 쓰는 ObjectNode를 사용해 보았습니다.
이스케이프 (백 슬래시)가 많은 JSON 문자열이 정말 엉망이되었습니다.
{"data":"{\"senderName\":\"PixelDev1729\",\"message\":\"asd\",\"serverType\":\"HUB\"}","metadata":"{\"id\":\"e0f77d09-cafa-4ff5-b553-0f0dc4bb76e3\",\"cha|
nnelName ":"global-chat ","serverId ":"9f10cf0b-d3eb-4804-98aa-92d747d75f5e ","type ":"SEND "}"}
너무 다른 접근 방식 ...
jsonString.replaceAll("^\"|\"$|\\\\", "");
우리가 먼저 얻은 동일한 문자열을 사용 합니다.
거의 유효한 JSON을 얻었지만 일부 큰 따옴표가 누락되었으므로 여전히 유효하지 않습니다.
{ "data": " {"senderName ":"wasmake ","message ":"sadasdas ","serverType ":"VALHEIM "} " , "metadata": " {"id ":"410c429c-06a4-466a- bce2-5edd63fabe17 ", |"channelName ":"global-chat ","serverId ":"640d01c3-5b13-4dcf-84bc-1d6b2987b333 ","type ":"SEND "} " }
데이터 " S enderName" 의 첫 번째 필드에서 이상한 일을하는 큰 따옴표 .
암호:
jackson을 사용하여 객체를 JSON으로 직렬화하여 Redis를 통해 메시지를 보내는 방법 : ( https://user-images.githubusercontent.com/8813159/104827760-06717600-5827-11eb-8cd6-48554db93c49.png )
redis에서받은 메시지에서 객체를 얻기 위해 jackson을 사용하여 JSON을 역 직렬화하는 방법 : ( https://user-images.githubusercontent.com/8813159/104827779-45073080-5827-11eb-84fc-47673c395b69.png )
RedisMetadata 클래스 : ( https://user-images.githubusercontent.com/8813159/104827795-5cdeb480-5827-11eb-9595-c9326ca59e3f.png )
콘솔 로그 :
( https://user-images.githubusercontent.com/8813159/104827799-66681c80-5827-11eb-8801-4c107df0dcb6.png )
( https://user-images.githubusercontent.com/8813159/104827801-6d8f2a80-5827-11eb-9170-80635c74110f.png )
우리는 모든 것을 시도했지만 행운이 없기 때문에 도움의 손길을 정말 감사드립니다. 미리 감사드립니다!
문제는 바로 거기에 있습니다
보시다시피 데이터 및 메타 데이터 값은 문자열로 변환 된 다음 기본 ObjectNode로 설정됩니다.
문제는 직렬화되지 않은 경우 실제로 값의 트리 형태가 아닌 문자열 값 (실제로 어떻게 호출되는지 모르겠 음)으로 변환되고 ObjectMapper#treeToValue
. 이 솔루션은과 ObjectNode으로 값을 변환하는 것입니다 ObjectMapper#valueToTree
그리고 그것을 설정 ObjectNode#set(String, JsonNode)
.
다른 해결책은 ObjectMapper#treeToValue
use 를 사용 하여 직접 변환하는 대신 deserialization 부분을 변경하는 것입니다 ObjectMapper#readValue
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다