有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

json Java Jackson,使用Map<String,Object>编组类,而不访问类代码库

我正在尝试使用Jackson映射器对类进行marshall(序列化)。 类具有映射属性。属性必须具有某种序列化。。。我得到的一切都是一个序列化的字节流或严重序列化的映射。toString()

我尝试过使用mixin或安装Jackson mapper。。。没有任何帮助

com。fasterxml。杰克逊2.8.11 通用域名格式。兔子。客户5.4.3

我的代码:

private RawMessage parseMetadata(RawMessage rawMessage, Envelope envelope, AMQP.BasicProperties properties) throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);


    JsonNode rootNode = mapper.createObjectNode();

    JsonNode message = mapper.valueToTree(new String(rawMessage.getPayload()));
    ((ObjectNode) rootNode).set("message", message);

    JsonNode envelopeNode = mapper.valueToTree(envelope);
    ((ObjectNode) rootNode).set("envelope", envelopeNode);

    JsonNode propertiesNode = mapper.valueToTree(properties);
    ((ObjectNode) rootNode).set("properties", propertiesNode);

    return new RawMessage(mapper.writerWithDefaultPrettyPrinter().writeValueAsBytes(rootNode));
}

结果:

{
  "properties": {
    "bodySize": 0,
    "headers": {
      "connection_name": {
        "bytes": "MTcyLjE5LjAuMTo0NTgzNiAtPiAxNzIuMTkuMC40OjU2NzI=",
        "stream": {
          "in": { "buf": "MTcyLjE5LjAuMTo0NTgzNiAtPiAxNzIuMTkuMC40OjU2NzI=", "pos": 0, "mark": 0, "count": 35 },
          "bytearr": "A...",
          "chararr": "\u0000...",
          "readBuffer": "AAAAAAAAAAA="
        }
      },
      "timestamp_in_ms": 1565957758662,
      "protocol": {
        "bytes": "ezAsOSwxfQ==",
        "stream": {
          "in": { "buf": "ezAsOSwxfQ==", "pos": 0, "mark": 0, "count": 7 },
          "bytearr": "AAA...",
          "chararr": "\u0000\u0000\...",
          "readBuffer": "AAAAAAAAAAA="
        }
      },...
      },
      "ssl": false
    },
    "deliveryMode": 2,
    "timestamp": 1565957758000,
    "classId": 60,
    "className": "basic"
  }
}
class BasicProperties extends com.rabbitmq.client.impl.AMQBasicProperties {
        private String contentType;
        private String contentEncoding;
        private Map<String,Object> headers; <--- 
        private Integer deliveryMode;
        private Integer priority;
        private String correlationId;
        private String replyTo;
        private String expiration;
        private String messageId;
        private Date timestamp;
        private String type;
        private String userId;
        private String appId;
        private String clusterId;
...}

复制:

import com.rabbitmq.client.AMQP;

Map<String, Object> map = new HashMap<>();
byte[] test =  "test".getBytes();
map.put("test", test);
AMQP.BasicProperties prop = new AMQP.BasicProperties(null, null, map,null,null,null,null,null,null,null,null,null,null,null);

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

JsonNode root = objectMapper.createObjectNode();

JsonNode propertiesN = objectMapper.valueToTree(prop);
((ObjectNode) root).set("properties", propertiesN);

LOG.info(root.toString());

结果:

{
  "properties": {
    "bodySize": 0,
    "headers": { "test": "dGVzdA==" },
    "classId": 60,
    "className": "basic"
  }
}

三个点意味着更多。太长了。字节流太多

我预计map的输出为->;关键字:字符串

我想让输出看起来像他的->;财产。标题。测试:“测试”

无任何AMQP注释。基本属性类

我认为Jacksons Mixin应该是这样做的


共 (1) 个答案

  1. # 1 楼答案

    回答这个问题: -让你拥有Jackson Mixin,它用定制的JsonSerialize类注释你的类 -创建自己的Serialize类,扩展JsonSerializer类 -使用addMixIn(DataClass.class,Mixin.class)方法将Mixin注册到mapper

    例如:

    创建Mixin

    abstract class MixIn {
      @JsonSerialize(using = MyPairSerializer.class)
      abstract Map<String, Object> get_map();
    }
    

    创建映射序列化程序

    class MyPairSerializer extends JsonSerializer<Map<String, Object>> {
      public void serialize(Map<String, Object> map, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException {
        for (Map.Entry<String, Object> entry : map.entrySet()) {
          gen.writeStringField(entry.getKey(), entry.getValue().toString());
        }
      }
    }
    

    注册序列化程序和映射对象

    // API call
    Data data = getData();
    
    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode node = objectMapper.valueToTree(data);
    System.out.println("node = " + node);
    

    之前: {“数据”:“测试”,“映射”:{“测试”:“dGVzdA=”}

    之后: {“数据”:“测试”,“映射”:{“测试”:“测试”}

    TLDR的答案是与自定义序列化程序混合