fsprojects / FSharp.Json

F# JSON Reflection based serialization library
Apache License 2.0
222 stars 26 forks source link

Specifying Default Values As Compile Time Constants #48

Open Evelios opened 3 years ago

Evelios commented 3 years ago

From the JsonConfig Documentation it specifies how default values in types should be used. I am trying to be able to get the record to be populated

type MyType= {
      [<JsonField(DefaultValue ="">]  // Works
      asString: string

      [<JsonField(DefaultValue =[||])>]  // Run time error
      asArray: int[]

      [<JsonField(DefaultValue = [])>]  // Compile Time Error
      asList: int list}

I'm assuming this code is used inside the reflexive record value code. Pulling in the default value to the JsonField so that it is able to give it a default value that way. So the JsonField is being created in the library code.

Giving it in this format requires this value to be a compile time constant. "" is a compile time constant, and so is [||] but [] isn't.

Running it in the array [||] example, I get the following run time error

System.ArgumentException : Object of type 'System.Object[]' cannot be converted to type 'System.Int32[]'.

Trying to build in the example with the list I get the following compile time error

[FS0267] This is not a valid constant expression or custom attribute value

I also can't use the Array.empty and List.empty values, because those are also not compile time constants.

I don't know if there is another recommended way of setting defaults that doesn't have this requirement, but I don't see a way of getting around this issue other the letting list values be optional, allowing for the null case, which is not optimal.