繁体   English   中英

使用对象作为字符串名称映射Json数组(Java)

[英]Mapping Json Array with Objects as String names (Java)

我有json:

{
  "albums": [
    {
      "default": {
        "privacy": "public"
           ......
        }
      }
    },
    {
      "second_album": {
        "privacy": "public"
        ......
      }
    },
    {
      "third_album": {
        "privacy": "public"
        ......
      }
    }
  }
  ]
}

我想为此json创建Java对象。

public class AlbumsResponse {

     private List<Album> albums = new ArrayList<>();

     public List<Album> getAlbums() {
         return albums;
     }

     public void setAlbums(List<Album> albums) {
         this.albums = albums;
     }
}

public class Album {

    private Title title;

    public Title getTitle() {
        return title;
    }

    public void setTitle(Title title) {
        this.title = title;
    }

}

但正如您所见,专辑在json中没有任何“标题”字段,但具有类似的内容

  "second_album": {
    "privacy": "public"
    ......
  }

如何处理? 如何将json-array中以json-object为单位的名称转换为java-object中的字段“ title”?

根据您的问题,我不确定要如何将显示的对象转换为Title ,但是我相信您可以使用自定义反序列化器来实现所需的功能。

例如,以下反序列化器获取JSON对象的第一个键,将其包装在Title ,然后返回具有该TitleAlbum

public static class AlbumDeserializer implements JsonDeserializer<Album> {
    @Override
    public Album deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        // Get the key of the first entry of the JSON object
        JsonObject jsonObject = json.getAsJsonObject();
        Map.Entry<String, JsonElement> firstEntry = jsonObject.entrySet().iterator().next();
        String firstEntryKey = firstEntry.getKey();

        // Create a Title instance using this key as the title
        Title title = new Title();
        title.setTitle(firstEntryKey);

        // Create an Album instance using this Title
        Album album = new Album();
        album.setTitle(title);
        return album;
    }
}

然后,您可以在Gson实例中注册此自定义反序列化器,并使用其转换JSON:

Gson gson = new GsonBuilder()
        .registerTypeAdapter(Album.class, new AlbumDeserializer())
        .create();

AlbumsResponse response = gson.fromJson(json, AlbumsResponse.class);

System.out.println(response);

假设您的类以基本方式实现toString在您的示例中运行它会显示以下内容:

AlbumsResponse{albums=[Album{title=Title{title='default'}}, Album{title=Title{title='second_album'}}, Album{title=Title{title='third_album'}}]}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM