2016-04-06 10 views
1

F # 'da yeniyim ve basit bir Json dosyasını CSV biçimine dönüştürmek için JsonProvider'ı kullanmak istiyorum. İşte benim F # komut dosyası:F # json'yu csv'ye dönüştür: Option <string> boş dizgede nasıl davranılır?

#r "./lib/FSharp.Data.dll" 
open FSharp.Data 

type Persons = JsonProvider<""" { 
    "persons": [ 
    { 
     "id": "1", 
     "name": "User1", 
     "company": "", 
     "address": "Streed, City" 
    }, 
    { 
     "id": "2", 
     "name": "User2", 
     "company": "", 
     "address": "" 
    } 
    ] 
} """> 
let persons = Persons.GetSample() 

for p in persons.Persons do 
    printfn "%i;%s" p.Id p.Name 
// printfn "%i;%s;%s;%s" p.Id p.Name p.Company p.Address 

Ben kodunun son satırını (printfn "% i;% s;% s;% s" p.Id p.Name p.Company p.Address) yorumsuz

This expression was expected to have type 'string' but here was type Option <string>

ne elde etmek istiyorum biçimlendirilmiş çizgileri gibi aşağıdaki 2 CSV edilir:

1;User1;;Street, City 
2;User2;; 

nasıl boş bir dizeye bir Seçeneği dönüştürebilirim aşağıdaki derleyici hatası alıyorum?

+0

Bu bir kopyasıdır. Fsharpforfunandprofit.com'daki "Option type" ve "Match expressionions" öğelerini veya MSDN'deki belgeleri okumanızı öneririm. –

cevap

4

Tomasz tarafından belirtildiği gibi desen eşleştirmelerini yorumlarda kullanabilirsiniz.

Diğer bir seçenek, option<'T> değerini alan defaultArg işlevini ve 'T varsayılan değeri, seçenek eksik bir değer olduğunda kullanıldığında kullanılır. Bir şey gibi:

for p in persons.Persons do 
    printfn "%i;%s;%s;%s" p.Id p.Name (defaultArg p.Company "") (defaultArg p.Address "") 
+0

Teşekkürler Tomas, “defaultArg” 'ın ihtiyaçlarınızı daha iyi karşıladığını buldum çünkü desende Json dosyasında boş olabilecek tüm olası alanları eşleştirmek zorunda değilim. –

+0

** Company ** ve ** Address ** için 'defaultArg' kullanıldıktan sonra, şirket alanında yeni bir sorunla karşılaşıyorum. Json'daki şirket öğelerinden hiçbirinin bir değeri olmadığından, derleyici şikayette bulunur ve tipin printfn (me) tarafından üstlenildiği gibi "IJsonDocument" ve "dize seçeneği" olmadığını söyler. Bunu nasıl düzeltebilirim? –

+0

Hmm, bu durumda, en iyi seçenek muhtemelen sizin örneklemenizi değiştirmek için geçerli bir değere sahip bir öğe içermesidir. –