【问题标题】:How can I replace substrings in a string with JSON values in GO?如何用 GO 中的 JSON 值替换字符串中的子字符串?
【发布时间】:2021-06-08 20:55:03
【问题描述】:

如果我有以下 JSON 文件用于指定如何运行程序:

{
   "programBinary" : "/usr/bin/foo",
   "extraArgs" : " --arg1=%argumentOne --arg2=%argumentTwo",
   "argumentOne" : "foo",
   "argumentTwo" : "bar"
}

在 golang 中,如何解析 extraArgs 字符串以找到 % 指定的 JSON 键并将其替换为 JSON 文件中的值?

我知道 golang 有一个内置的替换功能,但我不清楚的是如何解析字符串并找到 以“%”开头的标记。

基本上我需要一些类似于以下 go-pseudocode 的内容:

var rawMap map[string]json.RawMessage;
rawErr := json.Unmarshal(byteValue, &rawMap)
if(rawErr != nil) {
    log.Printf("JSON Marshalling error (raw): %s\n" , rawErr.Error());
}
extraArgString, _ := rawMap["extraArgs"];
argTokens := magicStringTokenizer(extraArgString, "%"); //Need code for this!
for _, argToken := range argTokens {    
     argValue, _ := rawMap[argToken];
     extraArgString = string.Replace(extraArgString, argToken, argValue);
}

显然,如果找不到密钥,则需要进行错误处理,但为了清楚起见,我省略了。

正如我们所看到的,我只想要以“%”开头的子字符串,所以字符串的所有其他部分都应该被丢弃。

【问题讨论】:

    标签: json string go replace tokenize


    【解决方案1】:

    您可以检查go regexp 查找模式“%”作为您的问题。但是,由于您的字符串很简单,并且您只需要子字符串,请替换 %paramName 的值。您只能使用 bytes.Replace 来解决您的问题。 (我没有使用strings.Replace,因为不需要解析为string)。

    go playground

    package main
    
    import (
        "encoding/json"
        "log"
        "bytes"
    )
    
    func main() {
        byteValue := []byte(`{
           "programBinary" : "/usr/bin/foo",
           "extraArgs" : " --arg1=%argumentOne --arg2=%argumentTwo",
           "argumentOne" : "foo",
           "argumentTwo" : "bar"
        }`)
        var rawMap map[string]json.RawMessage;
        rawErr := json.Unmarshal(byteValue, &rawMap)
        if(rawErr != nil) {
            log.Printf("JSON Marshalling error (raw): %s\n" , rawErr.Error());
        }
        
        byteResult := make([]byte, len(byteValue))
        copy(byteResult, byteValue)
        
        for key, value := range rawMap {
            stringEscaped := bytes.Replace([]byte(value), []byte("\""), []byte(""), 2);//Can either remove quotes, replace them with single quotes, or escape with \" here
            byteResult = bytes.Replace(byteResult, []byte("%"+key), stringEscaped, 1)
        }   
        log.Printf("Result:\n %s", string(byteResult))
    }
    

    【讨论】:

    • 这会导致 JSON 无法解析字符串类型参数的替换字节流错误,因为引号 (") 需要在替换字符串中进行转义。
    • 但是,在 bytes.Replace 之前进行第二次替换以删除引号。我已编辑您的答案以包含修复并接受结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2013-07-23
    相关资源
    最近更新 更多