如何正确模式匹配JsonConversions

问题描述 投票:1回答:1

嗨,我有以下代码可以正常工作,但是当我在Option.defaultWith函数中进行模式匹配时,编译器会警告我有关模式匹配不完整的信息。有没有更聪明的方法来达到相同的效果却没有警告?

我一直在考虑在其余情况下引发异常,但这很丑陋。

namespace JsonParser

open System
open System.Globalization
open FSharp.Data
open FSharp.Data.Runtime

type public Key = string

type public Value =
    | Int of int
    | Double of double
    | Decimal of decimal
    | String of string
    | DateTime of DateTime
    | Boolean of Boolean
    | Array of Value []
    | Guid of Guid
    | Null
    | Object of Record []

and public Record =
    { Key: Key
      Value: Value }

module public Json =

    let private culture = CultureInfo.InvariantCulture
    let private emptyArray = Array.empty<String>

    let rec private map (value: JsonValue) =
        JsonConversions.AsInteger culture value
        |> Option.map Value.Int
        |> Option.orElseWith (fun () -> JsonConversions.AsDecimal culture value |> Option.map Value.Decimal)
        |> Option.orElseWith (fun () -> JsonConversions.AsFloat emptyArray true culture value |> Option.map Decimal |> Option.map Value.Decimal)
        |> Option.orElseWith (fun () -> JsonConversions.AsGuid value |> Option.map Value.Guid)
        |> Option.orElseWith (fun () -> JsonConversions.AsDateTime culture value |> Option.map Value.DateTime)
        |> Option.orElseWith (fun () -> JsonConversions.AsBoolean value |> Option.map Value.Boolean)
        |> Option.defaultWith (fun () ->
            match value with
            | JsonValue.String x -> Value.String x
            | JsonValue.Null -> Value.Null
            | JsonValue.Array x ->
                x
                |> Array.map map
                |> Value.Array
            | JsonValue.Record x ->
                x
                |> Array.map (fun (x, y) ->
                    { Key = x
                      Value = map y })
                |> Value.Object)

嗨,我有以下代码可以正常运行,但是当我在Option.defaultWith函数中进行模式匹配时,编译器会警告我有关模式匹配不完整的信息。有没有更聪明的方法来...

f# f#-data
1个回答
0
投票

答案实际上取决于您要如何处理JSON数据中的各种极端情况。

© www.soinside.com 2019 - 2024. All rights reserved.