如何将JSON文件读入build.gradle并在build.gradle文件中使用字符串值

22

例如,在 build.gradle 中读取json文件,并将json值作为文件中的字符串使用。


{
  "type":"xyz",
  "properties": {
    "foo": {
      "type": "pqr"
     },
     "bar": {
       "type": "abc"
     },
     "baz": {
       "type": "lmo"
     }
  }
}

我需要调用 properties.bar.type,并将其中的 abc 替换为相应内容。

我需要将这些值转换为 string 并在 build.gradle 文件中使用。


AnimiVulpis:他可能想要获取一些键值,但是无法找到从gradle任务读取json的方法。 - Kulbhushan Singh
2个回答

39

通过Gradle,你可以执行任何Groovy代码,而且Groovy已经内置了JSON解析器。

例如,你可以使用一个任务将你的值打印到标准输出:

task parseJson {
    doLast {
        def jsonFile = file('path/to/json')
        def parsedJson = new groovy.json.JsonSlurper().parseText(jsonFile.text)

        println parsedJson.properties.bar.type
    }
}

0

随着Gradle 8.3,Kotlin成为官方的DSL语言,如果你使用的是buils.gradle.kts脚本文件,我会在回答中进行扩展。

Kotlin本身不包含JSON序列化组件。你需要添加kotlin-serialization-json的依赖。由于你需要在脚本中使用这个依赖,你必须通过buildscript{}块来引入它。

使用Gradle日志记录器打印值的解决方案:

import kotlinx.serialization.json.*
import java.nio.charset.Charset

plugins {
    id("base")
}
buildscript {
    dependencies {
        classpath("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")
    }
}

tasks.register("readFromJson") {
    doLast {
        // Read json file
        val jsonFile = project.file("jsonFile.json")
        // Convert into immutable JSON object
        val fileAsJsonObject = Json.decodeFromString<JsonObject>(jsonFile.readText(Charset.defaultCharset())); 
        // Read properties.bar.type and print to Gradle logger
        logger.quiet("properties.bar.type value: " + fileAsJsonObject["properties"]?.jsonObject?.get("bar")?.jsonObject?.get("type"))
    }
}

或者你可以混合使用Groovy的JsonSlurper类和Kotlin DSL。在Kotlin中,你必须预期JSON中节点的类型。
import org.apache.groovy.json.internal.LazyMap

tasks.register("readFromJson") {
    doLast {
        // Read json file
        val jsonFile = project.file("jsonFile.json")
        // Convert into LazyMap at a root level
        val fileAsJsonObject =  groovy.json.JsonSlurper().parseText(jsonFile.readText()) as LazyMap
        logger.quiet("properties.bar.type value: S" +
                (((fileAsJsonObject["properties"] as LazyMap)["bar"] as LazyMap))["type"]
        )
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接