如何遍历/映射作为数组的Js.Json.t?

杰米

我正在尝试解码具有类型Js.Json.tarray(Js.Json.t)显然不是的JSON数组调用Js.log(jsonList)显示它是一个数组,但是我不确定如何映射到数组中的元素以对其进行解码。

到目前为止,我已经:

let json_to_list = response => {
    switch (response |> Js.Json.decodeObject) {
        | None => {
            Js.log("Decoding JSON failed!!")
            None
        }
        | Some(jsonObject) => {
            switch (jsonObject -> Js.Dict.get("list")) {
                | None => {
                    Js.log("JSON didn't have a 'list' key/value.")
                    None
                }
                | Some(jsonList) => {
                    jsonList
                    |> Js.List.map(
                            /*  compiler is expecting an uncurried function */
                            record => {
                            switch (record->Js.Dict.get("session-id") { /* ... */ }
                        }
                    )
                }
            }
        }
    }
};

编译器期望的是非curried函数,我不知道该如何提供。

编辑

我想想我离我更近了,但是我正在This has type: array(unit) Somewhere wanted: unit上线(下图)value |> Array.map(Js.log)

let json_to_list = response => {
    Js.log("Decoding JSON")
    switch (response |> Js.Json.decodeObject) {
        | None => {
            Js.log("Decoding JSON failed!!")
            None
        }
        | Some(jsonObject) => {
            switch (jsonObject -> Js.Dict.get("list")) {
                | None => {
                    Js.log("JSON didn't have a 'list' key/value.")
                    None
                }
                | Some(jsonArray) => switch (Js.Json.decodeArray(jsonArray)) {
                    | None => {
                        Js.log("JSON Object wasn't an array.")
                        None
                    }
                    | Some(value) => {
                        Js.log("Value length: " ++ string_of_int(value|>Js.Array.length))
                        value |> Array.map(Js.log)
                        Some(value)
                    }
                }
            }
        }
    }
};
格伦斯

有几种方法可以执行此操作,具体取决于您在编译时对数据的了解以及实际需要的内容。

如果您确切知道它是什么,并且没有机会收到其他任何信息,则可以将其转换为所需的类型,而无需在运行时进行任何检查:

external toMyType: Js.Json.t => array(something) = "%identity"

let myData = toMyType(json)

如果直到运行时才知道数据的形状,则可以使用Js.Json.classify

let decodeArrayItem = ...

let myData : array(something) =
  switch Js.Json.classify(json) {
  | Js.Json.JSONArray(array) => Array.map(decodeArrayItem, array)
  | _ => []
  }
}

或者,如果除了阵列之外什么都可以得到,您可以将其Js.Json.,decodeArray用作简写,它返回一个option可以进一步处理的符号:

let decodeArrayItem = ...

let maybeData : option(array(something)) =
  Js.Json.decodeArray(json)
  |> Option.map(Array.map(decodeArrayItem))

最后,在大多数情况下,我推荐的选项是使用第三方JSON解码器库之一,该往往是为组合而设计的,因此对于解码大型数据结构更加方便。例如,使用@ glennsll / bs-json(显然这里没有偏见):

module Decode = {
  let arrayItem = ...

  let myData =
    Json.Decode.array(arrayItem)
}

let myData =
  try Decode.myData(json) catch {
  | Js.Json.DecodeError(_) => []
  }

编辑:至于您得到的实际错误,您可以通过使用略有不同的语法将一个咖喱匿名函数变成一个非咖喱匿名函数:

let curried = record => ...
let uncurried = (. record) => ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章