簡體   English   中英

將 Json 數組轉換為字符串列表

[英]Convert Json array to list of strings

我正在閱讀本教程https://www.stackbuilders.com/blog/nonsense-getting-started-with-reason-and-reason-react/ 我面臨的問題之一是api.noopschallenge.com現在已經死了。 我將 API 調用替換為此https://random-word-api.herokuapp.com/word?number=20這有效但返回 Json 數組。 我必須將 Json 數組轉換為列表(字符串)。

我將decodeWords function 修改為

let decodeWord = (json: Js.Json.t) : list(string) => 
    switch(Js.Json.decodeArray(json)) {
      | None => []
      | Some(array) => Belt.Array.map(Js.Json.decodeString, array)
    };

但這給了我錯誤

這有類型:Js.Json.t => option(Js.String.t) 但是某處想要:array('a)

如何將 Json 數組轉換為list(string)

兩個問題:

  1. 您已將 arguments 切換為Belt.Array.map ' 應該排在第一位。
  2. 由於decodeString返回一個option(string)而不僅僅是一個string ,您將不得不以某種方式處理None 使用Belt.Array.keepMap是一種忽略它們的較短方法。
let decodeWords = (json: Js.Json.t): list(string) =>
  switch (Js.Json.decodeArray(json)) {
  | None => []
  | Some(array) =>
    array->Belt.Array.keepMap(Js.Json.decodeString)->Belt.List.fromArray
  };

但是直接使用Js.Json API比較麻煩。 您可能需要考慮使用第三方 json 解碼庫,例如bs-json (免責聲明:由我編寫)。 然后它會很簡單:

let decodeWords = Json.Decode.(list(string))

或者,如果您仍然希望它返回一個空列表而不是在解碼失敗時引發異常:

let decodeWords = Json.Decode.(withDefault([], list(string)))

我想我自己解決了。 但如果您知道更好的解決方案,請告訴我

    let decodeWords = (json: Js.Json.t) : list(string) => 
      switch(Js.Json.decodeArray(json)) {
        | None => []
        | Some(array) => Belt.Array.reduce(array, [], (acc, value) => {
          switch(Js.Json.decodeString(value)) {
            | None => acc
            | Some(v) => [v, ...acc]
          }
       })
    };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM