我有一个json文件(嵌套json),我将其内容解组为map [string]接口。现在我必须实现分页,因为数据很大。客户端将作为查询参数发送所需的页面,如何切片我拥有的数据? 这是我正在处理的数据的片段:
"packages":{
"pkg1": {
"meta": {
"description": "description1",
"name": "pkg1.1"
},
"name": "pkg1.1"
},
"pkg2": {
"meta": {
"description": "description2",
"name": "pkg2.2"
},
"name": "pkg2.2"
},
}
所以我做的是我递归遍历数据并创建一个自定义类型的数组,其中包含我需要的数据(名称,描述),以便我可以使用它分页。这是我使用的代码:
type Object struct {
name string
description string
}
func iterate(aMap map[string]interface{}, result *[]Object){
for key, val := range aMap {
switch val.(type) {
case map[string]interface{}:
if(key == "meta"){
switch reflect.TypeOf(val).Kind() {
case reflect.Map:
s := reflect.ValueOf(val)
var tmpData Object
if(s.MapIndex(reflect.ValueOf("name")).IsValid()){
tmpData.name = s.MapIndex(reflect.ValueOf("name")).Interface().(string)
}
if(s.MapIndex(reflect.ValueOf("description")).IsValid()){
tmpData.description = s.MapIndex(reflect.ValueOf("description")).Interface().(string)
}
*result = append(*result, tmpData)
}
}
iterate(val.(map[string]interface{}), result)
default: //DO NOTHING!!
}
}
}
答案 0 :(得分:1)
如果您正在进行分页,那么数据必须表示为列表而不是对象?我假设你的JSON中的某个地方有一个项目列表,否则分页没有意义。
这应该不是很难,像这样的简单应该有效:
const (
itemsPerPage = 10
)
var data []map[string]interface{}
// pages start at 1, can't be 0 or less.
func GetDataPage(page int) []map[string]interface{} {
start := (page - 1) * itemsPerPage
stop := start + itemsPerPage
if start > len(data) {
return nil
}
if stop > len(data) {
stop = len(data)
}
return data[start:stop]
}
答案 1 :(得分:0)
您正在将您的json解组为一张本身没有订单的地图。为了能够对结果进行分页,您需要以某种方式对它们进行排序。
这样做的一种方法是对数据进行排序,然后将其存储到数组中。但是为了分页,你需要有序数据,这对于地图来说是不可能的。