如何使用JSONProvider复用类型定义?

5
我正在使用FSharp-Data中的JSONProvider自动创建用于消费web服务的类型,使用的是来自服务的示例响应。
然而,当涉及到在服务中重复使用的类型时,我有点困惑,例如有一个API方法返回单个X类型的项,而另一个API方法返回X类型的列表等。我真的需要为此生成多个定义吗?这不会意味着我会为同一事物拥有重复的类型吗?
所以,我想问的是,是否有一种方法可以从生成的JSON样本类型创建组合类型?
1个回答

5
如果你使用不同的样本单独调用JsonProvider,那么你将会得到相同内容的重复类型。遗憾的是,F# Data库无法解决这个问题。
你可以选择一次性将多个样本传递给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之前对其进行包装,然后使用OneTwo属性访问它。但是,这意味着o1.Persono2.Other现在是相同类型的:

o1.Person = o2.Other

这会返回false,因为在F# Data中我们没有实现JSON值的相等性,但类型检查通过-所以类型是相同的。

这很复杂,所以我可能会寻找其他方法来做你需要的事情-但这是在多个JSON样本之间获取共享类型的一种方式。


啊,我就猜到了这种情况,是的,我可能会尝试找到(或构建)更自然优雅的东西。是否可以扩展JsonProvider(或任何类型提供程序)以支持类似JsonProvider <MyType list>的语法,其中MyType是来自样本(或者可能是DU之类的任何类型)的先前定义的类型? - monoceres
3
如果你已经有了一个手动定义的类型,那么你不需要使用类型提供程序。只需使用JSON.NET或类似的工具即可。 - Fyodor Soikin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接