猿问

如何在 GO 中将字符串中的子字符串替换为 JSON 值?

如果我有以下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);

}

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


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


哆啦的时光机
浏览 146回答 1
1回答

弑天下

您可以检查正则表达式以查找模式“%”作为您的问题。但是,由于字符串很简单,并且您只需要子字符串,因此请替换 %paramName 的值。您只能使用字节。更换以解决您的问题。(我没有使用字符串。替换,因为不需要解析为字符串)。package mainimport (    "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))}
随时随地看视频慕课网APP

相关分类

Go
我要回答