在不知道完整结构的情况下反序列化 JSON

时间:2021-04-01 10:28:54

标签: json .net f# f#-data

我正在重做一个非常基本框架的后端,该框架连接到一个完全可定制的前端。它最初是在 PHP 中使用的,但在 F# 中进行了重构。虽然看起来 PHP 可能是更合适的语言。但是人们一直告诉我你可以在 F# 中做任何事情,我喜欢它的语法并且需要学习,当谈到 JSON 时,这个看似简单的项目让我难倒。这是我的 question yesterday 的进一步充实版本,但它比我想象的要复杂得多。

来了。

前端基本上是一组 HTML 文件,它们只是简单地加载到 PHP 中,然后使用 preg_replace() 替换诸如 [var: varName] 或 [var: array|key] 之类的东西或麻烦的:{{1 }}。这需要由翻译字典中定义的变量替换,该变量存储为 JSON,非程序员也可以编辑。

我无法更改前端或 JSON 文件,并且两者都设计为由非程序员编辑,因此很可能会出现错误,调用语言变量'不存在等

所以我们可能有 2 个 json 文件,[lang: hello]english.json

english.json 包含:

french.json

法语.json:

{
   "hello":"Hello",
   "bye":"Goodbye"
}

有一个包含

的模板
{
"hello": "Bonjour",
"duck": "Canard"
//Plus users can add whatever else they want here and expect to be able to use it in a template
}

在这种情况下,如果语言设置为“english”并且正在加载 english.json,则应为:

<b>[lang: hello]</b>

<span>Favourite Animal: [lang:duck]</span>

我们可以假设 json 格式 <b>Hello</b> <span>Favourite Animal: </span> Or in French: <b>Bonjour</b> <span>Favourite Animal: Canard</span> 始终为 key: value,但理想情况下我也想处理 string:string,但这可能超出了本问题的范围。

所以我需要转换一个 JSON 文件(通过动态名称调用,这给 F# Data 带来了一个我昨晚无法解决的问题,因为它只允许静态文件名作为示例,并且由于这两个文件具有可能与示例和提供的不同,类型提供程序不起作用)到字典或其他一些集合。

现在在模板解析函数中,我需要将 string: 'T 替换为类似

[lang: hello]

这意味着我需要动态调用密钥,而我不知道如何使用 FSharp.Data 提供的类型来做到这一点。

我也玩过一些透特以及一些有希望的结果,最终无处可去。我避免使用 JSON.NET,因为我认为它是付费的,但刚刚意识到我错了,所以可能是探索的途径

为了比较,PHP 函数看起来像这样:

let key = "duck"

(*Magic function to convert JSON to usable collection*)

let languageString = convertedJSONCollection.[key] (*And obviously check if containsKey first*)

在 F#/.NET 中有没有一种干净的方法可以做到这一点?与 PHP/Javascript 相比,使用 JSON 似乎真的很痛苦,我开始失去理智。我是否必须编写自己的解析器(这意味着可能会回到 PHP)?

为所有知道答案的 F# 天才干杯:p

1 个答案:

答案 0 :(得分:2)

open Thoth.Json.Net
let deserialiseDictionary (s: string) =
    s
    |> Decode.unsafeFromString (Decode.keyValuePairs Decode.string)
    |> Map.ofList

let printDictionary json =
    json
    |> deserialiseDictionary
    |> fun m -> printfn "%s" m.["hello"] // Hello

对于关于“T”的问题,问题变成了“T 可以是什么”?对于 json 来说,它非常有限,它可以是很多东西,字符串、json-object、number、bool 或 json 数组。如果它是 bool 或数字会发生什么?

相关问题