gpt4 book ai didi

java - org.kohsuke.github 中是否有内置机制将 GHRepository 对象序列化为 JSON?

转载 作者:行者123 更新时间:2023-12-02 00:49:34 25 4
gpt4 key购买 nike

我正在使用 org.kohsuke.github 中的 Java Github API 来检索 GHRepository 对象。我想将此对象序列化为 JSON。在 org.kohsuke.github 客户端中是否提供了执行此操作的方法?可能使用 jackson

目前,在使用 jackson 时,我必须创建一个自定义 pojo 以避免 Jackson 遇到 null 映射键和值。我怀疑这个 github 库已经有执行此操作的代码,因为我可以看到它在 GitHub.java 中序列化为 JSON,但我没有看到可公开访问的利用此功能的方法。下面的代码迭代我所有组织中的所有存储库,以获取存储库的 JSON 表示形式,然后将其存储在数据库中。

// Iterate over all orgs that I can see on enterprise
github.listOrganizations().withPageSize(100).forEach( org -> {

// Get all the repositories in an org
Map<String, GHRepository> ghRepositoryMap = org.getRepositories();

// Iterate over each repo object and serialize
for (Map.Entry<String, GHRepository> entry :ghRepositoryMap.entrySet() ) {

// Serialize to JSON
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); //Handles null fields ok
String jsonStr = objectMapper.writeValueAsString(entry.getValue()); // <-- this fails due to null key

}
}

最后一行结果:

com.fasterxml.jackson.databind.JsonMappingException: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?) (through reference chain: org.kohsuke.github.GHRepository["responseHeaderFields"]->java.util.Collections$UnmodifiableMap["null"])

根据检查,我相信这不是唯一的 null 键。我可能可以通过添加 mixins 来处理它们来自定义这个问题,但我正在 org.kohsuke.github 库中寻找一种内置的方式,使这变得更容易,因为它似乎有能力在内部执行此操作。

最佳答案

您应该实现并注册NullKeySerializer。请参阅下面的示例:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JsonApp {

public static void main(String[] args) throws Exception {
Map<String, List<String>> map = new HashMap<>();
map.put(null, Arrays.asList("A", "B", "C"));
map.put("regular-key", Arrays.asList("X", "Y"));

ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.getSerializerProvider().setNullKeySerializer(new NullKeySerializer());

System.out.println(mapper.writeValueAsString(map));
}
}

class NullKeySerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeFieldName("null");
}
}

上面的代码打印:

{
"null" : [ "A", "B", "C" ],
"regular-key" : [ "X", "Y" ]
}

此外,您不应为每个条目创建 ObjectMapper 实例。您可以创建一次并用于所有元素。

关于java - org.kohsuke.github 中是否有内置机制将 GHRepository 对象序列化为 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57871185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com