【发布时间】:2020-04-18 12:14:16
【问题描述】:
使用 F# 我正在尝试扫描 JSON 文件并将其数组与单个(随机生成的)数字数组进行比较。 json的格式是:
{"1":[#,#,#,#,#],"2":[#,#,#,#,#],...}
等 121 个条目。我目前正在尝试 Json.NET。我的问题是:
如何使用 Json.NET 导入本地文件?
我将如何着手对 json 键进行简单调用,以返回适合通过 for 循环运行它的数组值?
这是我的代码:
open System
open System.IO
open Newtonsoft.Json
(*open FSharp.Data
type Provider = JsonProvider<"powernum.json">
let numbers = Provider.Load("powernum.json")
//numbers.``1`` gets me the array but can't scan through all the IDs with an iterating for loop
(*
if numbers.``3`` = [|29;30;41;48;64|] then
printfn "True"
else printfn "False"
*)
(*numbers.JsonValue.Item "1"
let test (a: int) = string a
let testPile =
for i = 1 to 10 do
let goNum = numbers.JsonValue.Item (test i)
Console.Write goNum
Console.WriteLine ""
testPile // This works but is not usable for data comparison with an F# Array
*)
*)
let r = new StreamReader("\PATH\powernum.json")
let (json: string) = r.ReadToEnd();
let conv = JsonConvert.DeserializeObject<> (json)
Console.WriteLine("{0}",conv)//where I'm stuck with Json.NET
[<EntryPoint>]
let main argv =
let rnd = Random()
let numberGen = Set.empty.Add(rnd.Next(1,69)).Add(rnd.Next(1,69)).Add(rnd.Next(1,69)).Add(rnd.Next(1,69)).Add(rnd.Next(1,69)) |>Set.toArray |>Array.sort
Console.ReadKey() |> ignore
0// return an integer exit code
Jsontocsharp.com 呈现无效。
我尝试过使用 F# 数据,但我发现不可能进行迭代循环,因为我必须拉起带有重音符号的“键”来封装数字以将其读取为像这样的 int numbers.``1`` .它不带变量。在仍然使用 F# Data 的同时尝试了另一种方法,但它仅作为字符串在我尝试转换时出错。
为了比较,这是我在 python 中制作原型的版本:
import random
import json
with open('/PATH/powernum.json') as pnumbers:
data = json.load(pnumbers)
#makes an array with the range of numbers
Valid_numbers =[]
for x in range(69):
Valid_numbers.append(x+1)
generated = []
def pulledNumber():
generated[:]=[]
#adds numbers to the array from 0-4
while len(generated) !=5:
#takes a random number from the range of numbers
generate_number = random.choice(Valid_numbers)
#check if the two arrays have the same values
if generate_number not in generated:
#add to the array if values don't match
generated.append(generate_number)
generated.sort()
return generated
pulledNumber()
for x, y in data.items():
if generated not in y:
print("Id: %s passed" % x)
else:
print("Id: %s failed" % x)
pulledNumber()
break
print (pulledNumber())
【问题讨论】:
-
如果您需要使用 json。阅读type providers in F#。
-
@Wootiae - 当你有变量属性名称时使用
JsonProvider有点棘手,请参阅Can JsonProvider deserialise to a Generic.Dictionary?。如果您知道一种简单的方法,那么添加答案会很酷。