Ошибки декодирования в вязе 0,19 - PullRequest
0 голосов
/ 26 декабря 2018

Я новичок в elm, и мне очень тяжело разбирать json с html на elm и использовать его.

Вот что я пытаюсь сделать:

В моем htmldoc:

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

, затем в elm:

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"]

Мой json выглядит так:

{
  "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"
}   

Я вывожу весь ответ как debug.toString ввид только для того, чтобы увидеть, что происходит, потому что я также не знаю, как записать ошибку, которая была произведена раньше.Компилятор говорит, что мой вызов вопросов getQuestions создает ошибку Json.Decode.er, в которую мне трудно поверить, потому что я думаю, что все выглядит нормально для меня.

Ошибка:

"{\ "question \": \ "В бандитском жаргоне, если вы 'поете как канарейка', что вы делаете? \", \ "A \": \ "выдает себя за Синатру \", \ "B \": \ "говоритеполицейским \ ", \" C \ ": \" убийство врага \ ", \" D \ ": \" ставки на лошадей \ ", \" ответ \ ": \" B \ "}" Ожидается ОБЪЕКТс полем с именем question

1 Ответ

0 голосов
/ 26 декабря 2018

Похоже, вы передаете строку как flags, а не объект JSON.Если это так, вы можете сделать одно из двух:

1: проанализировать строку JSON на стороне JavaScript, прежде чем передавать ее в Elm через flags:

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

Недостатком этого подхода является то, что если во время синтаксического анализа возникает ошибка, она возникает на стороне JavaScript и должна обрабатываться там.Если вам нужно разобраться с ошибкой в ​​Elm, вам нужно передать более сложную структуру в flags, которая может представлять как ошибки, так и успех.

2: используйте decodeString вместо decodeValue и измените тип init и getQuestions соответственно:

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

getQuestions : String -> List QuestionToAnswer
getQuestions questions =
 case (decodeString questionDecoder questions) of
   Ok question ->
     [question]
   _ ->
       [ QuestionToAnswer "me" "me" "me" "me" "me" "me"]
...