【问题标题】:How to decode base64 encoded JSON in Go如何在 Go 中解码 base64 编码的 JSON
【发布时间】:2020-12-15 00:09:17
【问题描述】:

我有一个map[string][]byte 类型的地图,现在[]byte 的值是base64 编码的。 []byte 中有一个 JSON 编码,我想进一步使用它。现在我这样做是为了解码 base64 []byte 数组。

假设我的secretInfo 看起来像这样

apiVersion: v1
kind: Secret
metadata:
  namespace: kube-system
  name: my-credentials
data:
  secret_account.json: SGVsbG8sIHBsYXlncm91bmQ= // My base64 encoded data(not real/Actual data)
bytes, _ := b64.StdEncoding.DecodeString(string(secretInfo.Data["secret_account.json"])) // Converting data
var privateKeyJSON map[string]interface{}
err := json.Unmarshal(bytes, &privateKeyJSON)
if err != nil {
        r.Logger.Infof("Failed to parse secret %v", err)
    }

现在,我将 JSON 的值作为字符串传递给其他 JSON。

secretInfo.StringData["DecodedPrivateKeyJson"] = string(bytes)

它给我一个错误说,StringData.DecodedPrivateKeyJson 中的预期 JSON。

我错过了什么?

【问题讨论】:

  • 编码值似乎不是有效的 JSON。你能确定吗?
  • @mehdy 这是一个虚拟值,假设它是一个有效的 JSON。我无法发布实际的 JSON,因为它包含所有私有编码的 JSON,因为它有很多个人数据。但请放心,JSON 编码完美。

标签: json string go base64


【解决方案1】:

上面的代码好像有问题

  1. 您忽略了解码错误
  2. 您尚未提供有关如何解析机密信息的代码

添加少量案例的示例代码,希望对您有所帮助:)

主包

import (
    b64 "encoding/base64"
    "encoding/json"
    "fmt"
)

func main() {
    encodedJSONTestData := []string{
        "ewoiZmlyc3RuYW1lIjoiSmhvbiIsCiJsYXN0bmFtZSI6ICJEb2UiCn0=",
        "",
        "!@#$%rtgfdjkmyhm",
    }

    for i, encodedJSON := range encodedJSONTestData {
        fmt.Println("Case", i)
        bytes, err := b64.StdEncoding.DecodeString(encodedJSON) // Converting data
        
        if err!=nil{
            fmt.Println("Failed to Decode secret", err)
            continue
        }
        
        var privateKeyJSON map[string]interface{}
        err = json.Unmarshal(bytes, &privateKeyJSON)
        if err != nil {
            fmt.Println("Failed to parse secret", err)
            continue
        }

        fmt.Println("Success", privateKeyJSON)
    }
}

Go Playground

Updated same code to use []Byte to provide more clarity

【讨论】:

  • 嘿,Shubham,如果你仔细观察,我的具有编码值的地图是[]Byte 类型,然后编码为Base64。这里你声明了encodedJSONTestData,因为它包含[]string 值而不是[]byte。你能解决这个问题吗?。
  • @RajatSingh []string 用于显示多个案例,每个案例都在循环中运行,因此您可以检查不同的值如何影响输出,至于 []byte 在传递给 DecodeString 之前将它们转换为字符串,所以它是一样的
【解决方案2】:

我认为问题出在这一行:

secretInfo.StringData["DecodedPrivateKeyJson"] = string(bytes)

大概应该是这样的:

secretInfo.StringData["DecodedPrivateKeyJson"] = string(privateKeyJSON)

或者事件更好:

marshaledPrivateKeyJSON, _ := json.Marshal(privateKeyJSON)
secretInfo.StringData["DecodedPrivateKeyJson"] = string(marshaledPrivateKeyJSON)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    相关资源
    最近更新 更多