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

n53p2ov0  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(173)

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

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

我需要调用properties.bar.typeabc应该在那里被替换。
我需要将这些值转换为string并在build.gradle文件中使用

w46czmvw

w46czmvw1#

在Gradle中,您可以执行任何Groovy代码,并且Groovy已经内置了JSON解析器。

例如,你可以使用一个任务将你的值打印到stdout中:

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

        println parsedJson.properties.bar.type
    }
}
gwbalxhn

gwbalxhn2#

与Gradle 8.3一样,Kotlin是官方的DSL语言,如果您使用buils.gradle.kts脚本文件,我将扩展答案
Kotlin在base language itself中不包含JSON序列化组件。必须包含对kotlin-serialization-json的依赖。由于脚本中需要此依赖项,因此必须通过buildscript{}块包含它。
使用Gradle logger打印值的解决方案:

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"))
    }
}

或者你可以在KotlinDSL中混合使用Groovy JsonSlurper类。而在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"]
        )
    }
}

相关问题