我正在将一些JSON文件解组为[]map[string]string{}个 但通常情况下,源是肮脏的,有许多重复的相等对象.

输入内容如下所示:

[{"sa1":"8172"},{"sa3":"8175"},{"sa1":"8172"},{"sa3":"8175"},{"sa3":"8175"},{"sa3":"8175"},{"sa1":"8172"},{"sa3":"8175"},{"sa3":"8175"}]

结果是:

map[sa1:8172]
([]map[string]string) (len=9 cap=9) {
 (map[string]string) (len=1) {
  (string) (len=3) "sa1": (string) (len=4) "8172"
 },
 (map[string]string) (len=1) {
  (string) (len=3) "sa3": (string) (len=4) "8175"
 },
 (map[string]string) (len=1) {
  (string) (len=3) "sa1": (string) (len=4) "8172"
 },
 (map[string]string) (len=1) {
  (string) (len=3) "sa3": (string) (len=4) "8175"
 },
 (map[string]string) (len=1) {
  (string) (len=3) "sa3": (string) (len=4) "8175"
 },
 (map[string]string) (len=1) {
  (string) (len=3) "sa3": (string) (len=4) "8175"
 },
 (map[string]string) (len=1) {
  (string) (len=3) "sa1": (string) (len=4) "8172"
 },
 (map[string]string) (len=1) {
  (string) (len=3) "sa3": (string) (len=4) "8175"
 },
 (map[string]string) (len=1) {
  (string) (len=3) "sa3": (string) (len=4) "8175"
 }
}

我如何才能清理映射切片,使其仅包含唯一元素?

推荐答案

一种 Select 是将键值对直接解组为类似的类型,如 struct :

type Elem struct {
    k string
    v string
}

func (e *Elem) UnmarshalJSON(d []byte) error {
    m := map[string]string{}
    if err := json.Unmarshal(d, &m); err != nil {
        return err
    }

    for k, v := range m {
        e.k = k
        e.v = v
        return nil
    }
    return nil
}

一旦可以逐个比较元素,还可以将其包装在一个集合中,该集合在解组时过滤元素.是在这里含蓄地这样做,还是在事实发生后这样做,这是一个观点问题.让过滤成为自己的方法可能是一种更好的关注点分离,但为了简洁,我将其包含在UnmarshalJSON中.

type Elems []Elem

func (e *Elems) UnmarshalJSON(d []byte) error {
    tmp := []Elem{}
    err := json.Unmarshal(d, &tmp)
    if err != nil {
        return err
    }

    seen := map[Elem]bool{}
    for _, elem := range tmp {
        if seen[elem] {
            continue
        }
        seen[elem] = true
        *e = append(*e, elem)
    }
    return nil
}

然后,您可以解组为Elems:

    elems := Elems{}

    err := json.Unmarshal(js, &elems)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(elems)

这将为您提供两个独特的配对:[{sa1 8172} {sa3 8175}]

https://go.dev/play/p/U0iqBAjvz-1

Json相关问答推荐

为什么JQ筛选器不将原始输入打印为$var|.';文档?

使用快速json库编写json可以消除所有缩进

APIM 生成 JsonArray 到 EventHub

具有 (RegEx) 模式的 json-schema 中的枚举

无法使用 vue.js 访问 JSON 数组的项目

如何 Select 一个值,这是可选的 - 使用 jq

使用 jq 将消息转换为数组

如何通过 jolt 将一个对象中的键和值添加到数组中的每个对象中

将具有多个级别的 json 读入 DataFrame [python]

用powershell条件解析json文件的数组对象

如何对使用转换器的 Grails 服务进行单元测试?

可以通过 POST 使用 EventSource 传递参数的服务器发送事件 (SSE)

Rails:format.js 或 format.json,或两者兼而有之?

如何自动修复无效的 JSON 字符串?

如何让 javascript 从 .json 文件中读取?

如何使用 Gson 解码具有未知字段的 JSON?

如何将单引号转义成双引号转成单引号

如何对 jq 中的 map 数组中的值求和?

来自 Gson 的 JSON 字符串:删除双引号

在 iPhone 上解析 JSON 日期