json解析配置失败,错误信息:无效字符 ‘]’,寻找值的起始位置。

huangapple go评论82阅读模式
英文:

json unmarshal config failed, error: invalid character ']' looking for beginning of value

问题

你遇到的问题是在使用Golang编写JSON反序列化时出现错误,错误的原因是在"]"之前有一个逗号。你想知道为什么会出现这个错误,以及应该使用哪个JSON库来解决这个问题。

这个错误是因为你的JSON文件中有一个多余的逗号。在JSON中,逗号用于分隔数组或对象中的元素,但是在最后一个元素之后不能有逗号。在你的文件中,逗号出现在了最后一个元素之后,导致了错误。

为了解决这个问题,你可以使用Golang标准库中的"encoding/json"包来进行JSON反序列化。这个包提供了Unmarshal函数来将JSON数据解析为Go语言的结构体。

在你的代码中,你可以尝试删除错误的逗号,然后使用json.Unmarshal函数进行反序列化。如果你的JSON文件格式正确,那么反序列化应该可以成功。

另外,你还可以使用其他第三方的JSON库,比如"jsoniter"或"go-simplejson",它们在处理一些特殊情况下可能更加灵活和容错。但是在你的情况下,由于输入文件不能更改,所以更换JSON库可能并不能解决问题。

总结起来,你可以尝试删除错误的逗号,然后使用Golang标准库中的"encoding/json"包进行JSON反序列化。如果问题仍然存在,可能需要检查其他代码逻辑或者进一步调试。

英文:

user golang , write json unmarshal, error happened, Because of comma before "]".

import (
	"encoding/json"

	"github.com/c2h5oh/datasize"
	xdsboot "github.com/envoyproxy/go-control-plane/envoy/config/bootstrap/v2"
	"github.com/golang/protobuf/jsonpb"
)

err = json.Unmarshal(content, cfg)
	if err != nil {
		log.StartLogger.Fatalf("[config] [default load] json unmarshal config failed, error: %v", err)
	}
	return cfg

return error:

2021-07-14 06:53:39,637 [FATAL] [config] [default load] json unmarshal config failed, error: invalid character ']' looking for beginning of value

I use unit test case to run, find file input

func TestMosnEnvoyMode(t *testing.T) {

	content, _ := ioutil.ReadFile("./test.json") // this file is input file
	cfg := &MOSNConfig{}
	if err := json.Unmarshal([]byte(content), cfg); err != nil {
		t.Fatal(err)
	}
	if cfg.Mode() != Mix {
		t.Fatalf("config mode is %d", cfg.Mode())
	}
}

file content:

{
  

    "stats_matcher": {
      "inclusion_list": {
        "patterns": [
         
          {
            "prefix": "cluster.xds-grpc"
          },
          {
            "suffix": "ssl_context_update_by_sds"
          },   // the error cause by here, ","
        ]
      }
    }
  },

}

if I delete comma here

 {
            "suffix": "ssl_context_update_by_sds"
          },   // the error cause by here, ","

It is OK!

Now, why and which json lib should I use? Because the input file can not change.

答案1

得分: 2

如果可能的话,最好修复JSON,因为它是无效的JSON,有尾随逗号。

话虽如此,某些语言本身支持尾随逗号,尤其是JavaScript,所以你可能会在数据中看到它。

如果无法更改数据,请切换到支持尾随逗号的JSON解析器,比如HuJSON(也称为Human JSON),它支持JSON中的尾随逗号和注释。它是encoding/json的软分支,最后3个提交来自著名的Xoogler和前Golang团队成员Brad Fitzpatrick。

  • 仓库:https://github.com/tailscale/hujson
  • 文档:https://pkg.go.dev/github.com/tailscale/hujson

Unmarshal的语法与encoding/json相同,只需使用:

err := hujson.Unmarshal(data, v)

我已经使用过它,它的效果如描述的那样。

英文:

It's better if you can fix the JSON as it's invalid JSON to have trailing commas.

That being said, some languages support trailing commas natively, notably JavaScript, so you may see it in your data.

If you cannot change your data, switch to a JSON parser that supports trailing commas like HuJSON (aka Human JSON) which supports trailing commas and comments in JSON. It's a soft fork of encoding/json and the last 3 commits are from noted Xoogler and Ex-Golang team member Brad Fitzpatrick.

The Unmarshal syntax is the same as encoding/json, just use:

err := hujson.Unmarshal(data, v)

I've used it and it works as described.

huangapple
  • 本文由 发表于 2021年7月16日 13:39:17
  • 转载请务必保留本文链接:https://go.coder-hub.com/68403934.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定