![](/img/trans.png)
[英]Remove Strings That Appear in one Array from second list if they exist in OCaml/ReasonML
[英]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)
?
兩個問題:
Belt.Array.map
' 應該排在第一位。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.