Skip to content

Commit df09f75

Browse files
committed
Fix #133: Regression: failure on non-public records
1 parent d32c1c1 commit df09f75

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

src/FSharp.SystemTextJson/Record.fs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,13 @@ type JsonRecordConverter<'T>(options: JsonSerializerOptions, fsOptions: JsonFSha
3030
let fields = FSharpType.GetRecordFields(recordType, true)
3131

3232
let allProperties =
33-
let all = recordType.GetProperties(BindingFlags.Instance ||| BindingFlags.Public)
33+
let allPublic =
34+
recordType.GetProperties(BindingFlags.Instance ||| BindingFlags.Public)
35+
let all =
36+
if fields[0].GetGetMethod(true).IsPublic then
37+
allPublic
38+
else
39+
Array.append fields allPublic
3440
if fsOptions.IncludeRecordProperties then
3541
all
3642
else

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

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,30 @@ module NonStruct =
3434
let actual = JsonSerializer.Serialize({ bx = 1; by = "b" }, options)
3535
Assert.Equal("""{"bx":1,"by":"b"}""", actual)
3636

37+
type internal Internal = { ix: int }
38+
39+
[<Fact>]
40+
let ``serialize non-public record`` () =
41+
let actual = JsonSerializer.Serialize({ ix = 1 }, options)
42+
Assert.Equal("""{"ix":1}""", actual)
43+
44+
[<Fact>]
45+
let ``deserialize non-public record`` () =
46+
let actual = JsonSerializer.Deserialize<Internal>("""{"ix":1}""", options)
47+
Assert.Equal({ ix = 1 }, actual)
48+
49+
type PrivateFields = private { px: int }
50+
51+
[<Fact>]
52+
let ``serialize record with private fields`` () =
53+
let actual = JsonSerializer.Serialize({ px = 1 }, options)
54+
Assert.Equal("""{"px":1}""", actual)
55+
56+
[<Fact>]
57+
let ``deserialize record with private fields`` () =
58+
let actual = JsonSerializer.Deserialize<PrivateFields>("""{"px":1}""", options)
59+
Assert.Equal({ px = 1 }, actual)
60+
3761
[<Fact>]
3862
let ``not fill in nulls`` () =
3963
try
@@ -396,6 +420,32 @@ module Struct =
396420
let actual = JsonSerializer.Serialize({ bx = 1; by = "b" }, options)
397421
Assert.Equal("""{"bx":1,"by":"b"}""", actual)
398422

423+
[<Struct>]
424+
type internal Internal = { ix: int }
425+
426+
[<Fact>]
427+
let ``serialize non-public record`` () =
428+
let actual = JsonSerializer.Serialize({ ix = 1 }, options)
429+
Assert.Equal("""{"ix":1}""", actual)
430+
431+
[<Fact>]
432+
let ``deserialize non-public record`` () =
433+
let actual = JsonSerializer.Deserialize<Internal>("""{"ix":1}""", options)
434+
Assert.Equal({ ix = 1 }, actual)
435+
436+
[<Struct>]
437+
type PrivateFields = private { px: int }
438+
439+
[<Fact>]
440+
let ``serialize record with private fields`` () =
441+
let actual = JsonSerializer.Serialize({ px = 1 }, options)
442+
Assert.Equal("""{"px":1}""", actual)
443+
444+
[<Fact>]
445+
let ``deserialize record with private fields`` () =
446+
let actual = JsonSerializer.Deserialize<PrivateFields>("""{"px":1}""", options)
447+
Assert.Equal({ px = 1 }, actual)
448+
399449
[<Fact>]
400450
let ``not fill in nulls`` () =
401451
try

0 commit comments

Comments
 (0)