当前位置: 首页 > 知识库问答 >
问题:

Moshi将嵌套JSON值映射到字段

卫志泽
2023-03-14

有没有什么方法可以将嵌套的JSON值映射到字段而不需要额外的类?我有一个JSON响应

{
    "title": "Warriors",
    "artist": "Imagine Dragons",
    "apple_music": {
        "url": "https://music.apple.com/us/album/warriors/1440831203?app=music&at=1000l33QU&i=1440831624&mt=1",
        "discNumber": 1,
        "genreNames": [
            "Alternative",
            "Music"
        ],
    }
}

但是在apple_music中,我只需要url值。因此,我决定创建Kotlin数据类,并尝试使用@json注释的选项

data class Song(
    val title: String,
    val artist: String,
    @Json(name = "apple_music.url")
    val appleMusicUrl: String
)
Required value 'appleMusicUrl' (JSON name 'apple_music.url') missing at $

下面的代码正在工作

data class Song(
    val title: String,
    val artist: String,
    @Json(name = "apple_music")
    val appleMusic: AppleMusic
)

data class AppleMusic(val url: String)

我有几个嵌套值,为它们创建额外的类是相当夸张的。还有比为apple_music节点创建嵌套类更好的方法吗?

共有1个答案

国言
2023-03-14

可以做到这一点的一种方法是使用@JSONQualifier使用备用类型适配器。例如:

@Retention(RUNTIME)
@JsonQualifier
annotation class AppleMusicUrl

data class Song(
    val title: String,
    val artist: String,
    @AppleMusicUrl
    val appleMusicUrl: String
)

@FromJson
@AppleMusicUrl
fun fromJson(json: Map<String, Any?>): String {
    return json.getValue("url") as String
}
 类似资料:
  • 我有一个restendpoint,它返回3级嵌套json,如下所示: 我有一个java类,没有相同的3个嵌套级别: 当我使用restTemplate拨打rest电话时: jackson甚至没有使用json ignore属性映射字段departName(因为我猜它不在同一嵌套级别)。 如何将这个http json响应映射到忽略嵌套父json的java字段?

  • 这是我的DTO: 这是我的实体: 我想配置我的ModelMapper将Tag#id映射到TagVolumeDTO#idTag。这可能吗?

  • 我不知道如何在Java类中处理嵌套的JSON值。为了尽可能简单,我创建了四个Java类,每个类都有“嵌套级别”。然而,我试图在一个Java类中包含所有这些值。我该怎么做? Json: Java类:

  • 我想映射这个JSON数据: 对于此java对象: 但是它失败了,所有的值都是。我尝试在变量上方添加,但没有成功。 是否可以反序列化JSON,使其仅映射到(这个)一个类? 编辑:我使用Spring StreamListener进行如下映射:

  • 假设我有这些实体: null

  • 我试图动态解析一些JSON到一个Map 但是当我尝试使用一些更复杂的JSON和嵌套信息时失败了。我试图从json解析示例数据。组织 我得到以下错误 异常在线程"main"com.fasterxml.jackson.databind.JsonMapping异常:不能反序列化实例的java.lang.字符串START_OBJECT令牌 有没有办法将复杂的JSON数据解析成映射?