我正在使用 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/