2016-12-13 2 views
1

J'ai donc besoin de décoder un json qui contient un json array en elm. Voici mon modèle:elm: decode json qui contient un tableau json

type alias ValidationResult = 
    { parameter : String 
    , errorMessage : String 
    } 


type alias ErrorResponse = 
    { validationErrors : List ValidationResult } 

Et voici un exemple de la json:

{"ValidationErrors": [{"Parameter": "param1","ErrorMessage": "message 1"},{"Parameter": "param2","ErrorMessage": "error message 2"}]} 

J'ai essayé de créer un décodeur ValidationResult, comme:

decodeValidationResults : Decoder ValidationResult 
decodeValidationResults = 
    map2 ValidationResult 
    (at [ "Parameter" ] Json.Decode.string) 
    (at [ "ErrorMessage" ] Json.Decode.string) 

mais je ne Je ne sais pas comment aller plus loin.

J'utilise elm 0,18

Répondre

1

Vous êtes presque là! Vous avez juste besoin d'un décodeur qui décode le type ErrorResponse. Pour ce faire, créer un autre décodeur qui utilise une liste du décodeur que vous avez déjà créé, en supposant que le nom du champ est "ValidationErrors":

import Json.Decode exposing (..) 

decodeErrorResponse : Decoder ErrorResponse 
decodeErrorResponse = 
    map ErrorResponse 
     (field "ValidationErrors" (list decodeValidationResults)) 

Un conseil: Vous pouvez utiliser Json.Decode.field au lieu de Json.Decode.at quand il est seulement un seul niveau. Vous pouvez réécrire decodeValidationResults comme ceci:

decodeValidationResults : Decoder ValidationResult 
decodeValidationResults = 
    map2 ValidationResult 
    (field "Parameter" string) 
    (field "ErrorMessage" string) 
+0

Je savais que ce doit être quelque chose comme ça, mais je ne savais pas sur la liste (decodeValidationResults). Merci –