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

标签 java json jackson github-api jsonserializer

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

相关文章:

java - Jackson:如何在不修改 POJO 的情况下将现有属性编辑为 JSON?

java - ProcessingException : org. codehaus.jackson.map.JsonMappingException:无法从 START_ARRAY token 中反序列化 X 的实例

json - 让 jackson 忽略序列化为 json 时延迟初始化的字段

java - 在 Ubuntu 或 Windows 中运行的 Java 程序中套接字的不同行为

java - 使用可用的 System.console 启动另一个进程

json - 从JSON删除字符

json - 如何创建一个无限嵌套的 json 并在 go lang 数据结构中访问它?

java - Spring 的 messageResource 从 Session 隐式本地化 - 不必传递 Locale 引用

java - 这里有没有人有他们喜欢用于他们的 java web 应用程序的最喜欢的内存分析/内存泄漏工具?

javascript - 使用 angularjs 将数据推送到 ng-blur 上的 JSON