使用 JSONProvider 重用类型定义?
Reusing type definitions with JSONProvider?
我正在使用 FSharp-Data 的 JSONProvider 自动创建我正在使用的 Web 服务的类型,使用服务的示例响应。
然而,当涉及到在服务中重用的类型时,我有点困惑,例如有一个 api 方法 return 一个 X 类型的项目,而另一个returns 列表 X 等等。我真的必须为此生成多个定义吗,这是否意味着我将对同一事物有重复的类型?
所以,我想我真正想问的是,有没有一种方法可以从 JSON 样本生成的类型创建复合类型?
如果您对单独的样本单独调用 JsonProvider
,那么您将获得样本中相同事物的重复类型。遗憾的是,F# 数据库对此无能为力。
您可以选择将多个样本同时传递给 JsonProvider
(使用 SampleIsList
参数)。在这种情况下,它会尝试为您提供的所有样本找到一种类型 - 但它也会在所有样本中共享具有相同结构的类型。
我假设您不想为所有样本获取一种类型 - 在这种情况下,您可以像这样用额外的 JSON 对象包装单个样本(这里,真正的样本是嵌套的记录在 "one" 和 "two" 下):
type J = JsonProvider<"""
[ { "one": { "person": {"name": "Tomas"} } },
{ "two": { "num": 42, "other": {"name": "Tomas"} } } ]""", SampleIsList=true>
现在,您可以 运行 Parse
方法并使用 "one" 或 "two" 将示例包装在新的 JSON 对象中,具体取决于哪个您正在处理的样本:
let j1 = """{ "person": {"name": "Tomas"} }"""
let o1 = J.Parse("""{"one":""" + j1 + "}").One.Value
let j2 = """{ "num": 42, "other": {"name": "Tomas"} }"""
let o2 = J.Parse("""{"two":""" + j2 + "}").Two.Value
"one" 和 "two" 记录完全是任意的(我只是将它们添加为具有两个单独的名称)。我们在解析之前包装 JSON,然后我们使用 One
或 Two
属性 访问它。但是,这意味着 o1.Person
和 o2.Other
现在属于同一类型:
o1.Person = o2.Other
这个 returns false
因为我们没有在 F# Data 中对 JSON 值实现相等性,但是它进行了类型检查 - 所以类型是相同的。
这相当复杂,所以我可能会寻找其他方法来完成您的需要 - 但这是在多个 JSON 样本之间获取共享类型的一种方法。
我正在使用 FSharp-Data 的 JSONProvider 自动创建我正在使用的 Web 服务的类型,使用服务的示例响应。
然而,当涉及到在服务中重用的类型时,我有点困惑,例如有一个 api 方法 return 一个 X 类型的项目,而另一个returns 列表 X 等等。我真的必须为此生成多个定义吗,这是否意味着我将对同一事物有重复的类型?
所以,我想我真正想问的是,有没有一种方法可以从 JSON 样本生成的类型创建复合类型?
如果您对单独的样本单独调用 JsonProvider
,那么您将获得样本中相同事物的重复类型。遗憾的是,F# 数据库对此无能为力。
您可以选择将多个样本同时传递给 JsonProvider
(使用 SampleIsList
参数)。在这种情况下,它会尝试为您提供的所有样本找到一种类型 - 但它也会在所有样本中共享具有相同结构的类型。
我假设您不想为所有样本获取一种类型 - 在这种情况下,您可以像这样用额外的 JSON 对象包装单个样本(这里,真正的样本是嵌套的记录在 "one" 和 "two" 下):
type J = JsonProvider<"""
[ { "one": { "person": {"name": "Tomas"} } },
{ "two": { "num": 42, "other": {"name": "Tomas"} } } ]""", SampleIsList=true>
现在,您可以 运行 Parse
方法并使用 "one" 或 "two" 将示例包装在新的 JSON 对象中,具体取决于哪个您正在处理的样本:
let j1 = """{ "person": {"name": "Tomas"} }"""
let o1 = J.Parse("""{"one":""" + j1 + "}").One.Value
let j2 = """{ "num": 42, "other": {"name": "Tomas"} }"""
let o2 = J.Parse("""{"two":""" + j2 + "}").Two.Value
"one" 和 "two" 记录完全是任意的(我只是将它们添加为具有两个单独的名称)。我们在解析之前包装 JSON,然后我们使用 One
或 Two
属性 访问它。但是,这意味着 o1.Person
和 o2.Other
现在属于同一类型:
o1.Person = o2.Other
这个 returns false
因为我们没有在 F# Data 中对 JSON 值实现相等性,但是它进行了类型检查 - 所以类型是相同的。
这相当复杂,所以我可能会寻找其他方法来完成您的需要 - 但这是在多个 JSON 样本之间获取共享类型的一种方法。