Elm:如何编码嵌套对象

Elm : How to Encode Nested objects

型号

type alias Model {
      name : String
    , poi_coordinates : Coordinates
}

type alias Coordinates = 
    {
        coord_type : String
    ,   coordinates : List Float
    }


poiFormEncoder : Model -> Encode.Value
poiFormEncoder model =
    Encode.object
        [ 
          ( "name", Encode.string model.name )
        , ( "type", Encode.string model.poi_coordinates.coord_type)
        , ( "poi_coordinates", Encode.array Encode.float (Array.fromList model.poi_coordinates.coordinates) )
        ]

请问如何编码这种数据类型?我不知道,我做的编码器没有坐标填充。非常感谢任何帮助。 Json 文件格式如下

[
   {
        "name": "Mcd",
        "coordinates": {
            "type": "Point",
            "coordinates": [
                101.856603,
                2.924
            ]
        } 
    },
         .
         .
         .
]

您可以嵌套调用 Json.Encode.object。每次你想要在输出中有一个新的对象,你需要另一个,例如:

poiFormEncoder : Model -> Encode.Value
poiFormEncoder model =
    Encode.object
        [ ( "name", Encode.string model.name )
        , ( "coordinates"
          , Encode.object
                [ ( "type", Encode.string model.poi_coordinates.coord_type )
                , ( "coordinates", Encode.list Encode.float model.poi_coordinates.coordinates )
                ]
          )
        ]

这应该是有道理的:它是一个 (key, value) 对的列表,值应该是另一个对象。

附带说明一下,这取决于您的用例,但您的 Coordinates 类型看起来像是自定义 Elm 类型的主要候选者,例如:

type Coordinates 
    = Point { x : Float, y : Float }
    | Polar { r : Float, t : Float }
    | ...

如果您发现您正在做很多检查字符串 type 值然后相应地处理坐标的事情,那么这样的结构可能是内部使用的更好的结构。当然,最好的表示将取决于您如何使用类型。