golang断言:一个蛋疼的处理场景

这一切都来源于一个蛋疼的需求场景处理:

因为历史原因,一个需要用到的JSON数据被整个缓存进Redis的一个key中,大概如下:

1
2
3
127.0.0.1:6379> get dt
"{\"address\":[{\"duration\":90,\"format\":\"mp4\",\"url\":\"xxx.mp4\",\"ext\":\"{\\\"key\\\":\\\"val\\\"}\"},{\"duration\":90,\"format\":\"mp4\",\"url\":\"xxx.mp4\",\"ext\":\"{\\\"key\\\":\\\"val\\\"}\"}],\"value\":\"web\"}"
127.0.0.1:6379>

这里还是做了脱敏处理,实际的情形JSON的层级更深…
格式化显示的JSON结构大概是这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"address": [
{
"duration": 90,
"format": "mp4",
"url": "xxx.mp4",
"ext": "{\"key\":\"val\"}"
},
{
"duration": 90,
"format": "mp4",
"url": "xxx.mp4",
"ext": "{\"key\":\"val\"}"
}
],
"value": "web"
}

现在要做的是: address 里的每个元素的 url 字段需要更新。

现在知道的是:address 的值 是一个数组,数组的每个元素是一个map[string]interface{} 类型,map里的元素除了 “url”: “xxx.mp4”, 其他的数量不确定

实现代码大概如下(方便展示,省略了Redis读写的步骤):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
detailByte := []byte(`{"address":[{"duration":90,"format":"mp4","url":"xxx.mp4","ext":"{\"key\":\"val\"}"},{"duration":90,"format":"mp4","url":"xxx.mp4","ext":"{\"key\":\"val\"}"}],"value":"web"}`)
detail := make(map[string]interface{}, 0)
json.Unmarshal(detailByte, &detail)
formatJson, _ := json.MarshalIndent(detail, "", " ")
fmt.Println("before: ", string(formatJson))
if address, ok := detail["address"]; ok {
if item, ok2 := address.([]interface{}); ok2 {
for index, value := range item {
if vMap, ok3 := value.(map[string]interface{}); ok3 {
if _, ok4 := vMap["url"];ok4 {
vMap["url"] = "wtf.mp4"
}
item[index] = vMap
}
}
detail["address"] = item
}
}
formatJson, _ = json.MarshalIndent(detail, "", " ")
fmt.Println("after: ", string(formatJson))

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
before:  {
"address": [
{
"duration": 90,
"ext": "{\"key\":\"val\"}",
"format": "mp4",
"url": "xxx.mp4"
},
{
"duration": 90,
"ext": "{\"key\":\"val\"}",
"format": "mp4",
"url": "xxx.mp4"
}
],
"value": "web"
}
after: {
"address": [
{
"duration": 90,
"ext": "{\"key\":\"val\"}",
"format": "mp4",
"url": "wtf.mp4"
},
{
"duration": 90,
"ext": "{\"key\":\"val\"}",
"format": "mp4",
"url": "wtf.mp4"
}
],
"value": "web"
}

怎么说呢,实现了感觉又没有真正实现…

哎,蛋疼。