java - 如何使用 Kotlin 和 jackson ObjectMapper 从 json 中删除属性

标签 java kotlin jackson-databind

我想删除以下 JSON 中所有出现的“attributeToRemove”:

{
    "Item994": [
        {
            "attributeToRemove": {
                "someItem": null
            },
            "types": [
                "type194",
                "type294"
            ],
            "p1": "SOS"
        }
    ],
    "Item99": [
        {
            "attributeToRemove": {
                "someItem": null
            },
            "types": [
                "type19",
                "type29"
            ],
            "p1": "SOS"
        }
    ]
}

我尝试使用removeAll,但我保留了此错误:类型不匹配:推断类型为(JsonNode!) -> JsonNode!但是 (JsonNode!) -> 需要 boolean 值

有人可以建议如何解决这个问题吗?

这是我的代码:

import com.fasterxml.jackson.databind.ObjectMapper

    fun main ( args : Array < String > ) {

        val someString = "{\n" +
                "    \"Item994\": [\n" +
                "        {\n" +
                "            \"attributeToRemove\": {\n" +
                "                \"someItem\": null\n" +
                "            },\n" +
                "            \"types\": [\n" +
                "                \"type194\",\n" +
                "                \"type294\"\n" +
                "            ],\n" +
                "            \"p1\": \"SOS\"\n" +
                "        }\n" +
                "    ],\n" +
                "    \"Item99\": [\n" +
                "        {\n" +
                "            \"attributeToRemove\": {\n" +
                "                \"someItem\": null\n" +
                "            },\n" +
                "            \"types\": [\n" +
                "                \"type19\",\n" +
                "                \"type29\"\n" +
                "            ],\n" +
                "            \"p1\": \"SOS\"\n" +
                "        }\n" +
                "    ]\n" +
                "}"
        val mapper = ObjectMapper()
        val jsonStr = mapper.writerWithDefaultPrettyPrinter()
                .writeValueAsString(someString)

        val jsonResult = mapper.readTree(someString)
        jsonResult.removeAll { it.get("attributeToRemove") }

    }

最佳答案

import com.fasterxml.jackson.annotation.JsonAutoDetect
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.databind.ObjectMapper


@JsonIgnoreProperties(ignoreUnknown = true)
class Item99 {
    var p1: String? = null
    var types: Array<String>? = null
}

@JsonIgnoreProperties(ignoreUnknown = true)
class Item994 {
    var p1: String? = null
    var types: Array<String>? = null
}

class Wrapper {
    @JsonProperty("Item99")
    var item99: Array<Item99>? = null

    @JsonProperty("Item994")
    var item994: Array<Item994>? = null
}

object Main {

    var jsonString = "{\n" +
            "    \"Item994\": [\n" +
            "        {\n" +
            "            \"attributeToRemove\": {\n" +
            "                \"someItem\": null\n" +
            "            },\n" +
            "            \"types\": [\n" +
            "                \"type194\",\n" +
            "                \"type294\"\n" +
            "            ],\n" +
            "            \"p1\": \"SOS\"\n" +
            "        }\n" +
            "    ],\n" +
            "    \"Item99\": [\n" +
            "        {\n" +
            "            \"attributeToRemove\": {\n" +
            "                \"someItem\": null\n" +
            "            },\n" +
            "            \"types\": [\n" +
            "                \"type19\",\n" +
            "                \"type29\"\n" +
            "            ],\n" +
            "            \"p1\": \"SOS\"\n" +
            "        }\n" +
            "    ]\n" +
            "}"

    @JvmStatic
    fun main(args: Array<String>) {
        val mapper = ObjectMapper()
        mapper.visibilityChecker = mapper.serializationConfig.defaultVisibilityChecker.withCreatorVisibility(JsonAutoDetect.Visibility.ANY)
        val answer = mapper.readValue(jsonString, Wrapper::class.java)
        print(mapper.writeValueAsString(answer))
    }
}

关于java - 如何使用 Kotlin 和 jackson ObjectMapper 从 json 中删除属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51401195/

相关文章:

java - Android - 获取 JSONArray 问题

java - 如何在 JSP 中格式化值?

oop - 如何在复杂的纸牌游戏中平衡多态/继承/TypeData架构与原型(prototype)/享元模式的技巧?

java - 需要更改我的代码以从 Java 对象生成正确的 JSON - Jackson

java - 使用 jackson 转换带有重复键的 JSON

java - Jackson用空字符串而不是对象反序列化JSON字符串

java - 为什么当我施放 X< 时会收到警告?将 Item> 扩展为 X<Item>?

java - Amazon AWS 通过 Java API 创建 EBS(弹性 block 存储)

json - Gson.toJson()保留父级和子级字段,其中子级字段占主导

reflection - Kotlin 父类(super class) Kclass