рдПрд▓реНрдоред рдЖрд░рд╛рдорджрд╛рдпрдХ рдФрд░ рдЕрдЬреАрдмред Json.Encoder рдФрд░ Json.Decoder

рд╣рдо рдПрд▓реНрдо 0.18 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред


рдПрд▓реНрдоред рдЖрд░рд╛рдорджрд╛рдпрдХ рдФрд░ рдЕрдЬреАрдм
рдПрд▓реНрдоред рдЖрд░рд╛рдорджрд╛рдпрдХ рдФрд░ рдЕрдЬреАрдмред рд░рдЪрдирд╛
рдПрд▓реНрдоред рдЖрд░рд╛рдорджрд╛рдпрдХ рдФрд░ рдЕрдЬреАрдмред Http, рдЯрд╛рд╕реНрдХ


рдпрд╣ рд▓реЗрдЦ рдПрдирдХреЛрдбрд░ / рдбрд┐рдХреЛрдбрд░реНрд╕ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдЧрд╛ред


рдбрд┐рдХреЛрдбрд░ / рдПрдирдХреЛрдбрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


  1. рддреГрддреАрдп-рдкрдХреНрд╖ рд╕рдВрд╕рд╛рдзрдиреЛрдВ (Http, WebSocket, рдЖрджрд┐) рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг;
  2. рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рддрдЪреАрддред рдореИрдВ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдФрд░ рдореВрд▓ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрддрд╛рдКрдВрдЧрд╛ред

рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдПрд▓реНрдо рдХреЛ рд╣рдореЗрдВ рдмрд╛рд╣рд░реА рдбреЗрдЯрд╛ рдХреЛ рдЖрдВрддрд░рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Json.Decode рдореЙрдбреНрдпреВрд▓ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЛрд╕реЗрд╕ Json.Encode рд╣реИ ред


рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдирд┐рдпрдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рдХрд╛рд░ Json.Decode.Decoder a рд╣реИ ред рдпрд╣ рдкреНрд░рдХрд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкрд░рд┐рдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред


рдПрдирдХреЛрдбрд░ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - Json.Encode.Value ред


UserData рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред


type alias User = { id: Int , name: String , email: String } 

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХреЛрдбрдХ:


 decodeUserData : Json.Decode.Decoder UserData decodeUserData = Json.Decode.map3 UserData (Json.Decode.field тАЬidтАЭ Json.Decode.int) (Json.Decode.field тАЬnameтАЭ Json.Decode.string) (Json.Decode.field тАЬemailтАЭ Json.Decode.string) encodeUserData : UserData -> Json.Encode.Value encodeUserData userData = Json.Encode.object [ ( тАЬidтАЭ, Json.Encode.int userData.id) , ( тАЬnameтАЭ, Json.Encode.string userData.name) , ( тАЬemailтАЭ, Json.Encode.string userData.email) ] 

Json.Decode.map3 рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ UserData рдХреЗ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ UserData рдореЗрдВ рдЙрдирдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдХреНрд░рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рддреАрди рдбрд┐рдХреЛрдбрд░ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред


DecodeUserData рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ Json.Decode.decodeString рдпрд╛ Json.Decode.decodeValue рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг ред


EncodeUserData рдлрд╝рдВрдХреНрд╢рди Json.Encode.Value рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рд╣рд░ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ, Json.Encode.Value рдПрдХ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред


рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдмрд╣реБрдд рдХрдард┐рдирд╛рдИ рдХреЗ рдмрд┐рдирд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рдЬреАрд╡рди рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рд╛рде рдХреА рдХреБрдЫ рдЪрд┐рдХрдирд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбрд┐рдХреЛрдбрд░ рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рднреЗрджрдХ


рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдорд╛рд▓ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрдкрд╛рдж рдореЗрдВ рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдХрдИ рдореЗрдВ рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ:


  1. рдкреВрд░реНрдгрд╛рдВрдХ;
  2. рд╕реНрдЯреНрд░рд┐рдВрдЧ;
  3. рдЧрдгрдиреАрдпред рдорд╛рдиреНрдп рдорд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рдкрд╕рдВрдж рдорд╛рди рд▓реЗрддрд╛ рд╣реИред

рдПрдХ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдорд╛рдиреНрдп рд╣реИ:


 { тАЬidтАЭ: 1, тАЬnameтАЭ: тАЬProduct nameтАЭ, тАЬpriceтАЭ: 1000, тАЬattributesтАЭ: [ { тАЬidтАЭ: 1, тАЬnameтАЭ: тАЬLengthтАЭ, тАЬunitтАЭ: тАЬmetersтАЭ, тАЬvalueтАЭ: 100 }, { тАЬidтАЭ: 1, тАЬnameтАЭ: тАЬColorтАЭ, тАЬunitтАЭ: тАЬтАЭ, тАЬvalueтАЭ: { тАЬidтАЭ: 1, тАЬlabelтАЭ: тАЬredтАЭ } },... ] } 

рд╢реЗрд╖ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕рдорд╛рди рд╣реИред рдлрд┐рд░ рдПрдХ рдХрд╕реНрдЯрдо рдЙрддреНрдкрд╛рдж рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╡рд░рдг рд╣реЛрдЧрд╛:


 type alias Product = { id: Int , name: String , price: Int , attributes: Attributes } type alias Attributes = List Attribute type alias Attribute = { id: Int , name: String , unit: String , value: AttributeValue } type AttributeValue = IntValue Int | StringValue String | EnumValue Enum type alias Enum = { id: Int , label: String } 

рд╣рдо рд╡рд░реНрдгрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдереЛрдбрд╝рд╛ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред рдПрдХ рдЙрддреНрдкрд╛рдж (рдЙрддреНрдкрд╛рдж) рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ / рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ (рдЧреБрдг) рдХреА рдПрдХ рд╕реВрдЪреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ (рд╡рд┐рд╢реЗрд╖рддрд╛) рдореЗрдВ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдирд╛рдо, рдЖрдпрд╛рдо рдФрд░ рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рди рдХреЛ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рддрддреНрд╡ред Enum рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╕реЗрдЯ рд╕реЗ рдПрдХ рдореВрд▓реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ: рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░ рдорд╛рдирд╡-рдкрдардиреАрдп рдореВрд▓реНрдпред


рдбрд┐рдХреЛрдбрд░ рдХрд╛ рд╡рд░реНрдгрди, Json.Decode рдЙрдкрд╕рд░реНрдЧ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░реЗрдВ:


 decodeProduct : Decoder Product decodeProduct = map4 Product (field тАЬidтАЭ int) (field тАЬnameтАЭ string) (field тАЬpriceтАЭ int) (field тАЬattributesтАЭ decodeAttributes) decodeAttributes : Decoder Attributes decodeAttributes = list decodeAttribute decodeAttribute : Decoder Attribute decodeAttribute = map4 Attribute (field тАЬidтАЭ int) (field тАЬnameтАЭ string) (field тАЬunitтАЭ string) (field тАЬvalueтАЭ decodeAttributeValue) decodeAttributeValue : Decoder AttributeValue decodeAttributeValue = oneOf [ map IntValue int , map StringValue string , map EnumValue decodeEnumValue ] decodeEnumValue : Decoder Enum decodeEnumValue = map2 Enum (field тАЬidтАЭ int) (field тАЬlabelтАЭ string) 

рдкреВрд░реА рдЪрд╛рд▓ decodeAttributeValue рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред Json.Decode.oneOf рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рди рдХреЗ рд▓рд┐рдП рд╕рднреА рдорд╛рдиреНрдп рдбрд┐рдХреЛрдбрд░ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рддрд╛ рд╣реИред рдбрд┐рдХреЛрдбрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рджреНрд╡рд╛рд░рд╛ рд╕рдлрд▓ рдЕрдирдкреИрдХрд┐рдВрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдорд╛рди рдХреЛ рдПрдЯрд╡рд░реНрдЯрд╡реИрд▓реНрдпреВ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдЯреИрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЙрддреНрдкрд╛рдж рдкреНрд░рдХрд╛рд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ Json.Encode.object рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреБрдг рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдпрд╣ рдЯрд╛рдЗрдк рдПрдЯреНрд░реАрдмреНрдпреВрдЯ рд╡реЗрд▓реНрдпреВ рдХреА рдХреЛрдбрд┐рдВрдЧ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдкрд╣рд▓реЗ рд╡рд░реНрдгрд┐рдд JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдПрдирдХреЛрдбрд░ рдХреЛ Json.Encode рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 encodeAttributeValue : AttributeValue -> Value encodeAttributeValue attributeValue = case attributeValue of IntValue value -> int value StringValue value -> string value EnumValue value -> object [ (тАЬidтАЭ, int value.id) , (тАЬidтАЭ, string value.label) ] 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдПрдиреНрдХреЛрдбрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред


рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдмрджрд▓реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рднреЗрджрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред JSON рд╡рд┐рд╢реЗрд╖рддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:


 { тАЬidтАЭ: 1, тАЬnameтАЭ: тАЬAttribute nameтАЭ, тАЬtypeтАЭ: тАЬintтАЭ, тАЬvalue_intтАЭ: 1, тАЬvalue_stringтАЭ: null, тАЬvalue_enum_idтАЭ: null, тАЬvalue_enum_labelтАЭ: null } 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╡рд┐рднреЗрджрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдорд╛рди рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╡рд░реНрдгрди рд╕рдВрд░рдЪрдирд╛ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрднрд╡рддрдГ рдЗрд╕ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╡рд┐рд╡рд░рдг рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рдЖрдВрддрд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбрд┐рдХреЛрдбрд░ рдХрд╛ рд╡рд┐рд╡рд░рдг рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


 decodeAttribute2 : Decoder Attribute decodeAttribute2 = field "type" string |> andThen decodeAttributeValueType |> andThen (\attributeValue -> map4 Attribute (field "id" int) (field "name" string) (field "unit" string) (succeed attributeValue) ) decodeAttributeValueType : String -> Decoder AttributeValue decodeAttributeValueType valueType = case valueType of "int" -> field "value_int" int |> Json.Decode.map IntValue "string" -> field "value_string" string |> Json.Decode.map StringValue "enum" -> map2 Enum (field "value_enum_id" int) (field "value_enum_label" string) |> Json.Decode.map EnumValue _ -> Json.Decode.fail "Unknown attribute type" 

DecodeAttribute2 рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдорд┐рдиреЗрдЯрд░ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рди рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рд╣рдо рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реЗрд╖ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдбреАрдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдп рдХреЛ рдореВрд▓реНрдп рдлрд╝реАрд▓реНрдб рдХреЗ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред


рдбрд┐рдХреЛрдбрд░ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб ред


рдЖрдВрд╢рд┐рдХ рдкреНрд░рдХрд╛рд░ рдЕрджреНрдпрддрди


рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрдм рдПрдкреАрдЖрдИ рдкреВрд░реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рджреЗрдЦрдиреЗ рдпрд╛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХрд░рдг рдХрд░рддреЗ рд╕рдордпред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрджреЗрд╢ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдХреЛ рддреБрд░рдВрдд рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдбрд┐рдХреЛрдбрд░ рдХреЗ рдкреАрдЫреЗ рд╕рднреА рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╣реА рдЙрддреНрдкрд╛рдж рд▓реЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЙрддреНрдкрд╛рдж рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВрдЧреЗред


 type alias Product = { id: Int , name: String , price: Int , attributes: Attributes , status: Int } decodeUpdateStatus : Product -> Decoder Product decodeUpdateStatus product = field тАЬstatusтАЭ int |> andThen (\newStatus -> succeed { product | status = newStatus} ) 

рдпрд╛ рдЖрдк Json.Decode.map рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


 decodeUpdateStatus : Product -> Decoder Product decodeUpdateStatus product = field тАЬstatusтАЭ int |> map (\newStatus -> { product | status = newStatus} ) 

рддрд╛рд░реАрдЦ рдФрд░ рд╕рдордп


рд╣рдо Date.fromString рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рджрд┐рдирд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


 decodeDateFromString : Decoder Date.Date decodeDateFromString = string |> andThen (\stringDate -> case Date.fromString stringDate of Ok date -> Json.Decode.succeed date Err reason -> Json.Decode.fail reason ) 

рдпрджрд┐ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рджрд┐рдирд╛рдВрдХ / рд╕рдордп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдбрд┐рдХреЛрдбрд░ рдХреЛ рдирд┐рдореНрди рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 decodeDateFromTimestamp : Decoder Date.Date decodeDateFromTimestamp = oneOf [ int |> Json.Decode.map toFloat , float ] |> Json.Decode.map Date.fromTime 

Source: https://habr.com/ru/post/hi424437/


All Articles