2017-07-14 39 views
2

我有JSON字符串的数组如何从golang中的JSON数组中删除元素?

例如:

[ 
{ 
    "name":"abc" 
    "age":25 
} 
{ 
    "name":"xyz" 
    "age":"26" 
} 
] 

在运行时我想从数组中删除“名”。我们该怎么做。我不想解组。

[ 
    { 
     "age":25 
    } 
    { 
     "age":"26" 
    } 
    ] 
+0

如果你不想解组它,唯一的办法就是自己解析字节,你最终会实现一个状态机。 – tazo

+1

如果你真的不能取消它,你或许可以用正则表达式来完成。 – gabeio

+3

取消编组/修改/编组有什么问题?这似乎很简单。 –

回答

2

你可以使用你想要的,这个包gjsonsjson

例如:

package main 

import (
    "fmt" 
    "log" 
    "strconv" 

    "github.com/tidwall/gjson" 
    "github.com/tidwall/sjson" 
) 

func main() { 
    bJSON := []byte(`  
      [ 
       { 
        "name": "abc", 
        "age": 25 
       }, 
       { 
        "name": "xyz", 
        "age": 26 
       } 
      ] 
    `) 

    newJSON := bJSON 
    var err error 

    result := gjson.GetBytes(bJSON, "#.age") 

    for i := range result.Array() { 
     newJSON, err = sjson.DeleteBytes(newJSON, strconv.Itoa(i)+".age") 
     if err != nil { 
      log.Println(err) 
     } 
    } 

    fmt.Println(string(newJSON)) 
} 

输出:

[ 
    { 
    "name": "abc" 
    }, 
    { 
    "name": "xyz" 
    } 
] 
+0

我们可以在不添加“钥匙” –

2

如果你硬是不想解组的时候,就会做一些类型的正则表达式替换,或者建立一个状态机被卡住(实际上自己解编吧)。如果你问这个问题,那么你不应该采取这种方法。这种方法仅适用于非常高级的用户,除非极少数情况下没有优势。

我假设你只是不想费心编写代码来解组​​它,尽管如此,并不介意为你工作的工具,即使这涉及到封装下的解组。

如果我对我的猜测是正确的,你可以考虑一个像gabs这样的库(免责声明:我从来没有使用过这个库),它提供了简单的JSON操作。但是当然,它在这个过程中解组JSON,然后当你询问结果时再重新映射它。