json - 在 elm 中使 Json.Decode 不区分大小写
问题描述
有没有一种简单的方法可以让 elm (0.18) 中的 Json.Decode 不区分大小写?
decodeDepartmentDate : Json.Decode.Decoder DepartmentDate
decodeDepartmentDate =
Json.Decode.map6 DepartmentDate
(field "nameOfDay" Json.Decode.string)
(field "orderDate" Convert.datePart)
(field "mealTimeID" Json.Decode.string)
(field "mealTime" Json.Decode.string)
(field "departmentID" Json.Decode.string)
(field "department" Json.Decode.string)
我希望能够对多个后端使用相同的 elm SPA,并在默认情况下避免此类问题:
BadPayload "Expecting an object with a field named `nameOfDay` at _[11]
but instead got: {\"NameOfDay\":\"Wednesday\",\"OrderDate\":\"2018-09-05T00:00:00\",
\"MealTimeID\":\"546ccee0-e070-403e-a15b-63f4e1366054\",\"MealTime\":\"All Day\",
\"StartTime\":\"2018/06/05 05:04:38\",\"DepartmentID\":\"066a1c9f-97da-487e-b82f-f933b159c042\",
\"Department\":\"Side walk\"}"
谢谢
解决方案
据我所知,没有现成的解决方案可以这样做。但是你可以自己做!
最简单的方法可能是只生成不同的外壳并使用以下方法制作自己的field
解码器oneOf
:
myField name decoder =
Decode.oneOf
[ Decode.field name decoder
, Decode.field (String.toLower) decoder
]
另一种方法是将对象解码为键/值对,而不解码值,转换键,然后对其重新编码,以便能够在其上使用现有的 JSON 解码器:
lowerCaseKeys =
Decode.keyValuePairs Decode.value
|> Decode.map (List.map (\(key, value) -> (String.toLower key, value)))
|> Decode.map (Encode.object)
但是由于该值现在被包装在 aDecoder
你必须使用decodeValue
它并最终以 double-wrapped 结束Result
,这不是很好。不过,我可能会错过一些优雅的方式来完成这项工作。
相反,最好不要重新编码它,而只是制作你自己的field
解码器来处理字典。这也将允许您忽略您指定的键上的大小写。
lowerCaseKeys : Decode.Decoder (Dict.Dict String Decode.Value)
lowerCaseKeys =
Decode.keyValuePairs Decode.value
|> Decode.map (List.map (\( key, value ) -> ( String.toLower key, value )))
|> Decode.map Dict.fromList
myField : String -> Decode.Decoder a -> Dict.Dict String Decode.Value -> Decode.Decoder a
myField name decode dict =
case Dict.get (String.toLower name) dict of
Just value ->
case Decode.decodeValue decode value of
Ok v ->
Decode.succeed v
Err e ->
e |> Decode.errorToString |> Decode.fail
Nothing ->
Decode.fail "missing key"
result =
Decode.decodeString (lowerCaseKeys |> Decode.andThen (myField "fOO" Decode.int)) """{ "Foo": 42 }"""
推荐阅读
- amazon-web-services - 无法将目标 ID(启动配置)附加到 Terraform 中网络负载均衡器的目标组
- python - 当未提及整个路径时,pandas 如何访问 read_csv?
- android-gradle-plugin - Correct gradle directory in adndroid studio (for windows)
- twig - Htmlspecialchar in twig
- git - 我应该重新启动 git 存储库以打破技术变革吗?
- php - Search Chinese text in MySQL database
- c - How to implement algorithm for converting "month-week-day-hour" to "day of year"?
- apache-spark - Aggregating scattered files in Spark
- linux - 为什么超过 50 个用户在 Jmeter FTP 请求 (Linux vsftpd) 中出现高达 99% 的错误?
- python - figure() 和 add_axes() 有什么区别?