我得到的数据是这种格式的 xlsx 行:第 1 行值 1 是第一个单元格 (A1),第 1 行值 2 是第二个单元格 (B1) 等。任何单元格都可以(但不需要)包含样式,例如边框、填充等。样式将在大括号中,如以下数据所示:[[["row 1 value 1",{"Border":null,"Fill":{"arrFill":{"BgColor":"red"}},"Font":null,"ApplyBorder":null}],"第 1 行值 2","第 1 行值 3"],["第 2 行值 1","第 2 行值 2","第 2 行值 3"]]
如何解码此数据以获得不必要的样式映射?
最佳答案
您可能需要使用反射包来检查结果数组/映射中的数据类型。这看起来很乏味,但似乎这是唯一的出路。我在下面粘贴了一些快速而肮脏但可运行的代码来说明相同的内容:
package main
import (
"encoding/json"
"fmt"
"reflect"
)
func parsePrintArray(y interface{}) {
var dummy []interface{}
var dummy2 map[string]interface{}
if reflect.TypeOf(y) == reflect.TypeOf("") {
fmt.Printf("%s ", y)
return
}
if reflect.TypeOf(y) == reflect.TypeOf(dummy2) {
x := y.(map[string]interface{})
for ks, vi := range x {
fmt.Printf("\ndumping for key %s ", ks)
if vi != nil {
parsePrintArray(vi)
}
}
return
}
for k, yl := range y.([]interface{}) {
if reflect.TypeOf(yl) == reflect.TypeOf(dummy) {
fmt.Println("")
parsePrintArray(yl.([]interface{}))
} else if reflect.TypeOf(yl) == reflect.TypeOf("") {
fmt.Printf("%v: %s ", k, yl.(string))
} else if reflect.TypeOf(yl) == reflect.TypeOf(dummy2) {
x := yl.(map[string]interface{})
for ks, vi := range x {
fmt.Printf("\ndumping for key %s ", ks)
if vi != nil {
parsePrintArray(vi)
}
}
}
}
}
func main() {
x := "[[[\"row 1 value1\",{\"Border\":null,\"Fill\":{\"arrFill\":{\"BgColor\":\"red\"}},\"Font\":null,\"ApplyBorder\":null}],\"row 1 value2\",\"row 1 value 3\"],[\"row 2 value 1\",\"row 2 value 2\",\"row 2 value 3\"]]"
var y []interface{}
err := json.Unmarshal([]byte(x), &y)
if err != nil {
panic(err)
}
parsePrintArray(y)
fmt.Println("")
}
关于arrays - 解码 json 可选元素 Golang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39019499/