F# 急切地使用json类型提供程序加载所有分页数据

F# 急切地使用json类型提供程序加载所有分页数据,f#,type-providers,F#,Type Providers,Cosider一个API,其回复始终为以下结构: { "pagination": { "limit": int, "offset": int, "count": int, "total": int }, "data": [ {...some obj...} ] }

Cosider一个API,其回复始终为以下结构:

{
    "pagination": {
        "limit": int,
        "offset": int,
        "count": int,
        "total": int
    },
    "data": [
        {...some obj...}
    ]
}
因此,有效载荷只在数据对象的结构上有所不同

理想情况下,我想告诉F#,所有从示例构建的类型都有一些公共部分分页信息,因此我可以有一个读取所有页面的通用方法


是否可能,或者我必须使用两个类型提供程序分别提取
分页
对象和
数据
数组?我看到每个响应体有一个提供程序的好处,因为它支持从流中读取数据。

我将定义两种不同的提供类型,一种用于解析分页数据,另一种用于解析实际数据,例如:

type Pagination = JsonProvider<"""{ 
  "pagination": { "limit": 1, "offset": 2, 
    "count": 3, "total": 4 } 
  }""">
type OneDataType = JsonProvider<"""{
    "data": [ {"a": 1} ]
  }""">
type AnyData = JsonProvider<"""{ 
  "pagination": { "limit": 1, "offset": 2,
      "count": 3, "total": 4 },
  "data": [],
  "one_data_type": [ {"a":1} ],
  "another_data_type": [ {"b":"xx" }]
}""">

let a = AnyData.Load("/some/file")
// Access pagination data
a.Pagination
// Access data as if it was OneDataType
let oneData = [| for d in a.Data -> 
  AnyData.OneDataType(d.JsonValue) |]
如果您想使用提供的单一类型执行此操作,那么您可以为多种不同类型的数据定义多个不同的字段,但必须以不同的方式命名这些字段。然后,您需要进行一些修改以正确读取数据。我不会这么做,因为我觉得很困惑,但它看起来是这样的:

type Pagination = JsonProvider<"""{ 
  "pagination": { "limit": 1, "offset": 2, 
    "count": 3, "total": 4 } 
  }""">
type OneDataType = JsonProvider<"""{
    "data": [ {"a": 1} ]
  }""">
type AnyData = JsonProvider<"""{ 
  "pagination": { "limit": 1, "offset": 2,
      "count": 3, "total": 4 },
  "data": [],
  "one_data_type": [ {"a":1} ],
  "another_data_type": [ {"b":"xx" }]
}""">

let a = AnyData.Load("/some/file")
// Access pagination data
a.Pagination
// Access data as if it was OneDataType
let oneData = [| for d in a.Data -> 
  AnyData.OneDataType(d.JsonValue) |]
键入AnyData=JsonProvider
设a=AnyData.Load(“/some/file”)
//访问分页数据
a、 分页
//像访问一个数据类型一样访问数据
设oneData=[|对于a中的d.Data->
AnyData.OneDataType(d.JsonValue)|]