【问题标题】:Golang implementing pagination on map[string]interface{} dataGolang 在 map[string]interface{} 数据上实现分页
【发布时间】:2018-04-17 20:02:19
【问题描述】:

我有一个 json 文件(嵌套 json),我正在将其内容解组到一个 map[string] 接口中。现在我必须实现分页,因为数据很大。客户端将作为查询参数发送所需的页面,我如何分割我拥有的数据? 这是我正在处理的数据的 sn-p:

"packages":{
  "pkg1": {
    "meta": {
      "description": "description1",
      "name": "pkg1.1"
    },
    "name": "pkg1.1"
  },
  "pkg2": {
    "meta": {
      "description": "description2",
      "name": "pkg2.2"
    },
    "name": "pkg2.2"
  },
}

所以我所做的是我递归地遍历数据并创建了一个自定义类型的 array,其中包含我需要为每个条目(名称、描述)的数据,以便我可以将它用于分页。这是我使用的代码:

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!!
        }
}
}

【问题讨论】:

  • 你试过什么?尝试一些东西,然后在遇到错误时返回。
  • 您想在解组之前对数据进行切片,还是对解组后的结果进行切片?
  • 对未编组的结果进行切片

标签: go pagination


【解决方案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]
}

【讨论】:

  • 我用数据样本更新了我的问题。我需要名称和描述作为条目(页面的索引)。如您所见,我只处理对象,我应该找到一种方法来提取 {"name": "name1", "description": "description1"} 并将其附加到数组中,以便我可以索引它用于分页。
  • 我用我用来将我需要的数据转换为支持索引的数组的代码更新了我的问题。我使用了你提供的代码,它现在可以工作了。谢谢!
【解决方案2】:

您正在将您的 json 解组为一个本身没有顺序的地图。为了能够对结果进行分页,您需要以某种方式对它们进行排序。

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

【讨论】:

  • 这正是我现在正在做的事情,我需要提取数据并将其推送到一个数组中,以便我可以使用索引进行分页。
猜你喜欢
  • 1970-01-01
  • 2016-02-27
  • 2021-01-02
  • 2015-01-14
  • 1970-01-01
  • 2013-05-30
  • 2019-09-05
  • 2015-08-15
  • 1970-01-01
相关资源
最近更新 更多