java - 使用 Gson 从 JSOn 对象读取每一行

标签 java json api parsing gson

我有一个 Java 项目,我必须从 JSON 输入构建一个对象,该对象采用以下格式:

{
  "Shell": 13401,
  "JavaScript": 2693931,
  "Ruby": 2264,
  "C": 111534,
  "C++": 940606,
  "Python": 39021,
  "R": 2216,
  "D": 35036,
  "Objective-C": 4913
}

然后在我的代码中我有:

public void fetchProjectLanguages(Project project) throws IOException {
    List<Language> languages = null;

    String searchUrl = String.format("%s/repos/%s/%s/languages",
            REPO_API, project.getUser().getLogin(), project.getName());

    String jsonString = requests.get(searchUrl);
    Language lang = gson.fromJson(jsonString, Language.class);

    languages.add(lang);
}

我的Language对象由两个属性组成:nameloc,并且JSON输入本身并不代表一种语言,而是一组语言,即对象的每一行本身就是一种语言。在我的示例中:shell、javascript、ruby、c、c++、python、R、D 和 Objective-C。

它怎么能做到这一点?

非常感谢任何帮助!

最佳答案

您可以使用adapter

假设你有:

class Language
{
    public String name;
    public Integer loc;
}

class Languages
{
    public List<Language> list = new ArrayList<Language>();
}

适配器:

class LanguagesTypeAdapter implements JsonSerializer<Languages>, JsonDeserializer<Languages>
{
      public JsonElement serialize(Languages languages, Type typeOfT, JsonSerializationContext context)
      {
          JsonObject json = new JsonObject();

          for (Language language : languages.list)
          {
              json.addProperty(language.name, language.loc);
          }

          return json;
      }

      public Languages deserialize(JsonElement element, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
      {
          JsonObject json = element.getAsJsonObject();

          Languages languages = new Languages();

          for (Entry<String, JsonElement> entry : json.entrySet())
          {
              String name = entry.getKey();
              Integer loc = entry.getValue().getAsInt();

              Language language = new Language();
              language.name = name;
              language.loc = loc;

              languages.list.add(language); 
          }

          return languages;
      }
}

还有一个示例:

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Languages.class, new LanguagesTypeAdapter());

Gson gson = builder.create();

Languages languages = gson.fromJson("{"+
          "\"Shell\": 13401,"+
          "\"JavaScript\": 2693931,"+
          "\"Ruby\": 2264,"+
          "\"C\": 111534,"+
          "\"C++\": 940606,"+
          "\"Python\": 39021,"+
          "\"R\": 2216,"+
          "\"D\": 35036,"+
          "\"Objective-C\": 4913"+
        "}", Languages.class);

String json = gson.toJson(languages);

结果:

{"Shell":13401,"JavaScript":2693931,"Ruby":2264,"C":111534,"C++":940606,"Python":39021,"R":2216,"D":35036,"Objective-C":4913}

希望这有帮助...

关于java - 使用 Gson 从 JSOn 对象读取每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17261801/

相关文章:

php - MySQL 中存储的 JSON 编码 POST 的问题

java - 用于 Java AWS Lambda 的 POJO 输入处理程序的大写字段

javascript - 简单的 Javascript 我不知道如何将函数放在 if-else 语句中

c# - 向 3rd 方开发人员公开我的核心 API 的关键类/方法的最佳方式是什么?

java - 服务层API设计

java - 访问 PowerShell 对象中的文本。为什么它似乎不存储在数组中?

java - 使用 Runnable 作为回调/子程序的坏习惯?

java - 如何仅从 for 循环打印一次语句 - Java

java - Struts 2中使用ModelDriven上传文件Action类

java - 线程中的每个操作都发生在该线程中按程序顺序稍后出现的每个操作之前