如果你使用不同的样本单独调用
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之前对其进行包装,然后使用One
或Two
属性访问它。但是,这意味着o1.Person
和o2.Other
现在是相同类型的:
o1.Person = o2.Other
这会返回false
,因为在F# Data中我们没有实现JSON值的相等性,但类型检查通过-所以类型是相同的。
这很复杂,所以我可能会寻找其他方法来做你需要的事情-但这是在多个JSON样本之间获取共享类型的一种方式。