Golang在map [string] interface {}数据上实现分页

时间:2018-04-16 12:58:35

标签: go pagination

我有一个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!!
        }
}
}

2 个答案:

答案 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解组为一张本身没有订单的地图。为了能够对结果进行分页,您需要以某种方式对它们进行排序。

这样做的一种方法是对数据进行排序,然后将其存储到数组中。但是为了分页,你需要有序数据,这对于地图来说是不可能的。