微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在重做一个非常基本框架的后端,该框架连接到一个完全可定制的前端。它最初是在 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

解决方法

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 或数字会发生什么?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。