Skip to content

Commit 3818b81

Browse files
committed
fix(#204): extraneous field name in enum-like serialization
1 parent 5eda34d commit 3818b81

File tree

2 files changed

+26
-9
lines changed

2 files changed

+26
-9
lines changed

src/FSharp.SystemTextJson/Union.fs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,12 @@ module private Case =
297297
| JsonName.Int name -> writer.WriteNumber(fsOptions.UnionTagName, name)
298298
| JsonName.Bool name -> writer.WriteBoolean(fsOptions.UnionTagName, name)
299299

300+
let writeCaseNameAsValue (writer: Utf8JsonWriter) (case: Case) =
301+
match case.Names[0] with
302+
| JsonName.String name -> writer.WriteStringValue(name)
303+
| JsonName.Int name -> writer.WriteNumberValue(name)
304+
| JsonName.Bool name -> writer.WriteBooleanValue(name)
305+
300306

301307
type JsonUnionConverter<'T>
302308
internal (options: JsonSerializerOptions, fsOptions: JsonFSharpOptionsRecord, cases: UnionCaseInfo[]) =
@@ -614,12 +620,6 @@ type JsonUnionConverter<'T>
614620
else
615621
writeFieldsAsArray writer case value options
616622

617-
let writeCaseNameAsValue (writer: Utf8JsonWriter) (case: Case) =
618-
match case.Names[0] with
619-
| JsonName.String name -> writer.WriteStringValue(name)
620-
| JsonName.Int name -> writer.WriteNumberValue(name)
621-
| JsonName.Bool name -> writer.WriteBooleanValue(name)
622-
623623
let writeAdjacentTag (writer: Utf8JsonWriter) (case: Case) (value: obj) (options: JsonSerializerOptions) =
624624
writer.WriteStartObject()
625625
Case.writeCaseNameAsField fsOptions writer case
@@ -641,7 +641,7 @@ type JsonUnionConverter<'T>
641641
writeFieldsAsRestOfObject writer case value options
642642
else
643643
writer.WriteStartArray()
644-
writeCaseNameAsValue writer case
644+
Case.writeCaseNameAsValue writer case
645645
writeFieldsAsRestOfArray writer case value options
646646

647647
let writeUntagged (writer: Utf8JsonWriter) (case: Case) (value: obj) (options: JsonSerializerOptions) =
@@ -680,7 +680,7 @@ type JsonUnionConverter<'T>
680680
let tag = tagReader value
681681
let case = cases[tag]
682682
if unwrapFieldlessTags && case.Fields.Length = 0 then
683-
writeCaseNameAsValue writer case
683+
Case.writeCaseNameAsValue writer case
684684
else
685685
match baseFormat with
686686
| JsonUnionEncoding.AdjacentTag -> writeAdjacentTag writer case value options
@@ -792,7 +792,7 @@ type JsonEnumLikeUnionConverter<'T> internal (options: JsonSerializerOptions, fs
792792

793793
override this.Write(writer, value, _options) =
794794
let tag = tagReader value
795-
Case.writeCaseNameAsField fsOptions writer cases[tag]
795+
Case.writeCaseNameAsValue writer cases[tag]
796796

797797
override this.WriteAsPropertyName(writer, value, _options) =
798798
let tag = tagReader value

tests/FSharp.SystemTextJson.Tests/Test.Regression.fs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,3 +126,20 @@ let ``regression #172`` () =
126126
options.Converters.Add(JsonFSharpConverter())
127127
Assert.Equal("{\"X\":null}", JsonSerializer.Serialize(x, options))
128128
Assert.Equal("{\"Y\":null}", JsonSerializer.Serialize(y, options))
129+
130+
module ``Regression #204`` =
131+
type Enum =
132+
| Case1
133+
| Case2
134+
135+
type Record = { Field: Enum }
136+
137+
let options =
138+
JsonFSharpOptions.Default().WithUnionUnwrapFieldlessTags().ToJsonSerializerOptions()
139+
140+
let actual () =
141+
JsonSerializer.Serialize({ Field = Case2 }, options)
142+
143+
[<Fact>]
144+
let ``regression #204`` () =
145+
Assert.Equal("""{"Field":"Case2"}""", ``Regression #204``.actual ())

0 commit comments

Comments
 (0)