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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"packages":{
 "pkg1": {
   "meta": {
     "description":"description1",
     "name":"pkg1.1"
    },
   "name":"pkg1.1"
  },
 "pkg2": {
   "meta": {
     "description":"description2",
     "name":"pkg2.2"
    },
   "name":"pkg2.2"
  },
}

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

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
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!!
        }
}
}
  • 你尝试了什么? 尝试一些操作,然后在遇到错误时返回。
  • 您要在解组数据之前对数据进行切片,还是对未解组的结果进行切片?
  • 切片未整理的结果

如果要进行分页,必须在某处将数据表示为列表而不是对象? 我假设在JSON的某个地方,您有一个项目列表,否则分页没有意义。

应该不难,像这样的简单事情应该起作用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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"}并将其附加到数组中,以便对其进行索引 分页。
  • 我使用用于将所需数据转换为支持索引的数组的代码更新了我的问题。 我使用了您提供的代码,现在可以使用了。 谢谢!

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

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

  • 那正是我现在正在处理的内容,我需要提取数据并将其推入数组中,以便可以使用索引进行分页。