Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在不知道完整结构的情况下反序列化JSON_Json_.net_F#_F# Data - Fatal编程技术网

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

在不知道完整结构的情况下反序列化JSON,json,.net,f#,f#-data,Json,.net,F#,F# Data,我正在重做一个非常基本的框架的后端,该框架连接到一个完全可定制的前端。它最初是用PHP编写的,但是为了重构,它一直在F#中缓慢地进行。尽管看起来PHP可能是更合适的语言。但人们一直告诉我,你可以用F#做任何事情,我喜欢语法,需要学习,而这个看似简单的项目让我在谈到JSON时感到困惑。这是一个更加充实的版本,但它比我想象的要复杂得多 来吧 前端基本上是一个HTML文件的集合,这些文件只需在PHP中加载,preg_replace()用于替换[var:varName]或[var:array | key

我正在重做一个非常基本的框架的后端,该框架连接到一个完全可定制的前端。它最初是用PHP编写的,但是为了重构,它一直在F#中缓慢地进行。尽管看起来PHP可能是更合适的语言。但人们一直告诉我,你可以用F#做任何事情,我喜欢语法,需要学习,而这个看似简单的项目让我在谈到JSON时感到困惑。这是一个更加充实的版本,但它比我想象的要复杂得多

来吧

前端基本上是一个HTML文件的集合,这些文件只需在PHP中加载,preg_replace()用于替换[var:varName]或[var:array | key]之类的内容,或者替换麻烦的内容:
[lang:hello]
。这需要用翻译字典中定义的变量来替换,该变量存储为JSON,也可以由非程序员编辑

我无法更改前端或JSON文件,它们都是为非程序员编辑而设计的,因此很可能会出现错误、调用不存在的语言变量等

所以我们可能有两个json文件,
english.json
french.json

english.json包含:

{
   "hello":"Hello",
   "bye":"Goodbye"
}
french.json:

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

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

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

这意味着我需要动态调用该键,但我不知道如何使用FSharp.Data提供的类型来实现这一点

我也曾尝试过一些Thoth,但最终却毫无结果。我避免使用JSON.NET,因为我认为它是付费的,但我刚刚意识到我错了,所以可能有一条途径可以探索

为了进行比较,PHP函数如下所示:

function loadLanguage($lang='english){
    $json = file_get_contents("$lang.json");
    return json_decode($json, true);
}

$key = 'duck';

$langVars = loadLanguage();
$duck = $langVars[$key] || "";
在F#/.NET中有没有一种干净的方法可以做到这一点?与PHP/Javascript相比,使用JSON似乎真的很痛苦,我开始发疯了。我是否必须编写自己的解析器(这意味着可能要回到PHP)

为你们所有知道答案的天才干杯: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

对于这个问题,这个问题不会变成,什么是不可能的?对于json来说,它非常有限,可以是很多东西,比如字符串、json对象、数字、bool或json数组。如果是布尔或数字,会发生什么情况?

这是否回答了您的问题?这个问题(在很大程度上)是其他方面的重复,应该是单独的问题。这个问题是我的(并在这个问题中链接)。我很难做出这样的回答,因为有些没有直接应用到我的情况(动态加载和访问),这似乎使我测试的那些无法使用。也许它应该被分解成更小的问题!是的,请把它分解一下。因此,“如何替换(部分)应用程序”不是一个好地方。一旦开始寻找“如何读取文件”,如何将文件内容解析为JSON“…你会更容易找到答案。你是对的,如果我在短时间内问了很多小问题,这就像垃圾邮件一样。但是你是对的。我会确保这样做的。向前将是布尔或int转换为字符串,它将永远不会是数组。如果Thoth一个有效,那么我就大大复杂化了。比ks
function loadLanguage($lang='english){
    $json = file_get_contents("$lang.json");
    return json_decode($json, true);
}

$key = 'duck';

$langVars = loadLanguage();
$duck = $langVars[$key] || "";
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