使用JSONProvider重用类型定义?

时间:2015-05-25 08:32:46

标签: json f# type-providers f#-data

我使用FSharp-Data中的JSONProvider自动为我使用服务中的示例响应消费的网络服务创建类型。

但是,当涉及到在服务中重用的类型时,我有点困惑,例如,有一个api方法返回X类型的单个项,而另一个返回X列表,依此类推。我是否真的需要为此生成多个定义,并且不会意味着我会为同一个东西重复类型?

所以,我想我真正想问的是,有没有办法从JSON样本生成的类型中创建复合类型?

1 个答案:

答案 0 :(得分:5)

如果您使用单独的样本单独调用JsonProvider,那么您将获得样本中相同内容的重复类型。可悲的是,F#数据库可以解决这个问题。

您拥有的一个选项是同时将多个样本传递给JsonProvider(使用SampleIsList参数)。在这种情况下,它会尝试为您提供的所有样本找到一种类型 - 但它也会在所有样本中共享具有相同结构的类型。

我假设您不希望为所有样本获取一个类型 - 在这种情况下,您可以使用其他类似的JSON对象包装单个样本(此处,真实样本是嵌套在&#34下的记录;一个& #34;和"两个"):

type J = JsonProvider<"""
  [ { "one": { "person": {"name": "Tomas"} } },
    { "two": { "num": 42, "other":  {"name": "Tomas"} } } ]""", SampleIsList=true>

现在,您可以运行Parse方法并使用&#34; one&#34;将样本包装到新的JSON对象中。或者&#34;两个&#34;,取决于您正在处理的样本:

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

&#34; one&#34;和&#34;两个&#34;记录完全是任意的(我只是将它们添加到两个单独的名称中)。我们在解析之前包装JSON,然后使用OneTwo属性访问它。但是,这意味着o1.Persono2.Other现在属于同一类型:

o1.Person = o2.Other

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

这相当复杂,所以我可能会寻找其他方法来做你需要的东西 - 但这是在多个JSON样本中获取共享类型的一种方法。