如何在 GO 中用 JSON 值替换字符串中的子字符串?
How can I replace substrings in a string with JSON values in GO?
如果我有以下 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);
}
显然,如果找不到密钥,则需要进行错误处理,但为了清楚起见,我省略了它。
如您所见,我只想要以“%”开头的子字符串,因此应丢弃字符串的所有其他部分。
您可以检查 go regexp 查找模式“%”作为您的问题。但是,由于您的字符串很简单,并且您只需要子字符串,因此请替换 %paramName 的值。您只能使用 bytes.Replace 来解决您的问题。 (我没有使用 strings.Replace 因为不需要解析为字符串)。
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 文件来指定如何 运行 一个程序:
{
"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);
}
显然,如果找不到密钥,则需要进行错误处理,但为了清楚起见,我省略了它。
如您所见,我只想要以“%”开头的子字符串,因此应丢弃字符串的所有其他部分。
您可以检查 go regexp 查找模式“%”作为您的问题。但是,由于您的字符串很简单,并且您只需要子字符串,因此请替换 %paramName 的值。您只能使用 bytes.Replace 来解决您的问题。 (我没有使用 strings.Replace 因为不需要解析为字符串)。
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))
}