当前位置: 首页 > 知识库问答 >
问题:

Java Jackson,用map编组类,不访问类代码基

艾焕
2023-03-14

com.fasterxml.jackson 2.8.11 com.rabbitmq.client 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"
  }
}

我认为杰克逊·米辛斯应该是这样做的方式。

共有1个答案

彭令秋
2023-03-14

这个问题的答案:-让您拥有Jackson Mixin,用自定义JsonSerialize类注释您的类-创建您自己的Serialize类,扩展JsonSerializer类-用addMixIn(dataclass.class,Mixin.class)方法将Mixin注册到mapper

示例:

创建密心

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);
 类似资料:
  • 我尝试使用Logstash tcp套接字追加器将日志从java应用程序发送到Logstash。java应用程序。已经可以使用logback 1.1.9(slf4j)和其他追加器。 现在,我将以下行添加到logback-test.xml中:

  • npm包允许我们在TypeScript应用程序中使用反应。我们将组件定义为 在这里,我们必须声明组件道具和状态的类型(在类型变量中)。 在我们声明了这些类型之后,TypeScript使用这些类型来验证组件的使用(传递给它的道具的形状)。 我想围绕这样一个组件创建一个容器。容器将重用组件的道具。但是为了用相同的道具创建另一个组件,我必须重新声明道具的类型。或者从原始零部件文件中导出它们并导入到容器中

  • 不工作的Kotlin代码如下所示: 我省略了(我相信)没有必要重现这个问题的代码。 Kotlin代码实际上是编译的,但在运行时,它在线程“main”java.lang.IllegalAccesserRor中抛出访问类foo.bar.utils.foo$bar$qux。当悬停在上时,IntelliJ显示一个提示,提示中定义了:public/*package*/open class Qux,所以在此上

  • 需要你的帮助解决这个错误在Flutter...也如何在其他屏幕上使用这个回调的实例? 这是我的留言。json数据模型 我的消息是一个模型。飞奔 这是我的留言。飞奔 _TypeError(类型“List”不是类型“Map”的子类型

  • CodeIgniter的zip编码类允许你创建ZIP压缩文档。文档可以保存在你的桌面或者某个文件夹里 初始化 与其他CodeIgniter里的类一样,ZIP类在控制器里完成初始化工作,函数:$this->load->library$this->load->library('zip'); 一旦加载,ZIP库对象可以用$this->zip来使用 使用样例 这个例子演示了如何压缩一个文件并保存到你服务器

  • CodeIgniter 的 Zip 编码类允许你创建 Zip 压缩文档,文档可以被下载到你的桌面 或者 保存到某个文件夹里。 使用 Zip 编码类 初始化类 使用示例 类参考 使用 Zip 编码类 初始化类 正如 CodeIgniter 中的其他类一样,在你的控制器中使用 $this->load->library() 方法来初始化 Zip 编码类: $this->load->library('zi