2017-01-10 16 views
5

Czy to możliwe, aby szeregować opcjonalne wartości w F # przy użyciu FsPickler takie, że:JSON serializacji opcjonalnych wartości z FsPickler

  • gdy wartość jest Niektórzy(), wartość zawarta jest w odcinkach
  • a kiedy jest Nie, w ogóle nie jest serializowany?

W poniższym przykładzie kodu:

type Person = { name: string; age: int option } 

let data = [ 
    { name = "Helena"; age = Some(24) }; 
    { name = "Peter"; age = None } 
] 

let jsonSerializer = FsPickler.CreateJsonSerializer(true, true) 
let streamWriter = new StreamWriter(@"C:\output.json") 
let out = jsonSerializer.SerializeSequence(streamWriter, data) 

plik output.json zawiera następujące JSON:

[ 
    { 
    "name": "Helena", 
    "age": { 
     "Some": 24 
    } 
    }, 
    { 
    "name": "Peter", 
    "age": null 
    } 
] 

ale chciałbym zawartość pliku JSON wyglądać tak zamiast:

[ 
    { 
    "name": "Helena", 
    "age": 24 
    }, 
    { 
    "name": "Peter" 
    } 
] 

Jestem nami ing FsPickler.Json v3.2.0 i Newtonsoft.Json v9.0.1.

UPDATE (11 stycznia 2017): Użycie skryptu w GIST połączonego przez Stuart poniższa odpowiedź, mam to działa tak:

let obj = { name = "Peter"; age = None } 
let stringWriter = new StringWriter() 
let jsonSerializer = new JsonSerializer() 
jsonSerializer.Converters.Add(new IdiomaticDuConverter()) 
jsonSerializer.NullValueHandling <- NullValueHandling.Ignore 
jsonSerializer.Serialize(stringWriter, obj) 

Odpowiedz

2

Korzystanie Newtonsoft.Json można użyć gist here (kredyt: Isaac Abraham), aby dać ci zachowanie, którego szukasz.

To zabawne, kilka chwil przed opublikowaniem tego, szukałem, czy to samo istnieje w FsPickler.Json, ale nie doszedłem do żadnych wniosków. Możesz użyć TypeShape, który jest używany w FsPickler, aby uczynić sedno czystszym, ale nie masz pewności, czy FsPickler.Json może zrobić to za ciebie z pudełka.

+1

Dzięki za link. Dzięki kodowi w istocie byłem w stanie osiągnąć to, czego szukałem. Zaktualizuję pytanie za pomocą kodu, którego użyłem. –

1

Jestem autorem FsPickler, więc pomyślałem, że będę repost odpowiedź, którą dałem w podobnym issue.

Nie, zarządzanie kształtem formatów serializacji wykracza poza bibliotekę design goals. Chociaż możesz użyć pickler combinators, aby wpłynąć na wygląd typów serializowanych, zajmie Ci to tylko tyle czasu.

0

Z FSharp.Json biblioteki będzie pracować tylko dobrze:

open FSharp.Json 

type Person = { name: string; age: int option } 

let data = [ 
    { name = "Helena"; age = Some(24) }; 
    { name = "Peter"; age = None } 
] 

let json = Json.serialize data 

To daje następujące JSON:

[ 
    { "name": "Helena", "age": 24 }, 
    { "name": "Peter", "age": null } 
] 

Jak opcja Brak jest seryjny jest konfigurowalny. Oto sposób na pominięcie członu opcja, że ​​nie ma żadnej wartości, należy zwrócić uwagę na config:

let config = JsonConfig.create(serializeNone=SerializeNone.Omit) 
let json = Json.serializeEx config data 

Ujawnienie: Jestem autorem biblioteki FSharp.Json.

Powiązane problemy