Elm 0.19中的解码错误

时间:2018-12-26 17:59:25

标签: json elm ffi

我是Elm的新手,我很难将json从html解析为elm并使用它。

这就是我想要做的:

在我的html文档中:

d_name

然后在榆木里:

var app = Elm.Main.init({
    node: document.getElementById("app"),
    flags: questions
});

我的json看起来像这样:

main =
  Browser.element { init = init, update = update, subscriptions = subscriptions, view = view }

-- MODEL

type alias Model = 
    {
       questionsToAnswer: List QuestionToAnswer
     , currentQuestion: Int
     , initializeGame: Bool
    }

type alias QuestionToAnswer =
    {
        question: String
     ,  a: String
     ,  b: String
     ,  c: String
     ,  d: String
     ,  answer: String
    }

questionDecoder : Decoder QuestionToAnswer

questionDecoder =
    map6 QuestionToAnswer 
         (field "question" string)
         (field "A" string)
         (field "B" string)
         (field "C" string)
         (field "D" string)
         (field "answer" string)

init : Json.Decode.Value -> (Model, Cmd Msg)
init questions =
  (Model (getQuestions questions) 0 True, Cmd.none)

getQuestions : Json.Decode.Value -> List QuestionToAnswer

getQuestions questions =
 case(decodeValue questionDecoder questions) of
   Ok question ->
     [question]
   _ ->
       [ QuestionToAnswer "me" "me" "me" "me" "me" "me"]

我在视图中将所有响应输出为debug.toString,以查看发生了什么,因为我也不知道如何记录以前产生的错误。编译器说我对getQuestions问题的调用会产生一个Json.Decode.error,我觉得很难相信,因为我认为一切对我来说都很好。

错误:

  

“ {\” question \“:\”在流氓行话中,如果您像金丝雀一样唱歌,您在做什么?\“,\” A \“:\”冒充Sinatra \“,\” B \ “:\”与警察交谈\“,\” C \“:\”杀死敌人\“,\” D \“:\”在马匹上打赌\“,\” answer \“:\” B \“ }“期望对象名为{ "question": "In mobster lingo, if you 'sing like a canary' what are you doing?", "A": "impersonating Sinatra", "B": "talking to the cops", "C": "killing an enemy", "D": "betting on horses", "answer": "B" }

的对象

1 个答案:

答案 0 :(得分:3)

您似乎正在以GRPC_GO_LOG_VERBOSITY_LEVEL=99 GRPC_GO_LOG_SEVERITY_LEVEL=info的形式传递字符串,而不是JSON对象。如果是这样,您可以执行以下两项操作之一:

1:在JavaScript端解析JSON字符串,然后通过flags将其传递给Elm:

flags

这种方法的缺点是,如果解析期间发生错误,则该错误发生在JavaScript端,必须在那儿进行处理。如果您需要处理Elm中的错误,则必须将一个更复杂的结构传递给var app = Elm.Main.init({ node: document.getElementById("app"), flags: JSON.parse(questions) }); ,该结构既可以表示错误,也可以表示成功。

2:使用flags代替decodeString,并相应地更改decodeValueinit的类型:

getQuestions