刘光辉
15 小时以前 34981c30a78e8bbd7791131059a9210f9928b62c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package jnpf.limsEntity;
 
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
 
import java.io.IOException;
 
/**
 * 兼容 String / Array / Object 的反序列化器。
 * 用于需要"把复杂 JSON 值原样存到 text 字段、回显时 JSON.parse"的场景,
 * 例如前端传的附件数组 [{fileId, url, ...}],后端存 JSON 字符串到 DB。
 *
 * <p>规则:
 * <ul>
 *   <li>null → null</li>
 *   <li>字符串 → 原样字符串</li>
 *   <li>数组 / 对象 / 数字 / 布尔 → 节点的 JSON 字符串形式</li>
 * </ul>
 */
public class JsonNodeAsStringDeserializer extends StdDeserializer<String> {
 
    public JsonNodeAsStringDeserializer() {
        super(String.class);
    }
 
    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        JsonToken t = p.currentToken();
        if (t == JsonToken.VALUE_NULL) {
            return null;
        }
        if (t == JsonToken.VALUE_STRING) {
            return p.getValueAsString();
        }
        JsonNode node = p.readValueAsTree();
        return node.toString();
    }
}