2017-12-02 220 views
3

我使用F#類型,並用它在WPF窗口 的數據源,也產生從它的JSON:F#類型JSON是輸出名稱@和名稱

type Customer = { 
        mutable Name: string ; 
        mutable Phone: PhoneNumber list 
       } 
       and 
        PhoneNumber = { 
            mutable Number: string 
           } 

但輸出是這:

{"[email protected]":"Superhero","[email protected]":[{"[email protected]":"111","Number":"111"},{"[email protected]":"222","Number":"222"},{"[email protected]":"333","Number":"333"}],"Name":"Superhero","Phones":[{"[email protected]":"111","Number":"111"},{"[email protected]":"222","Number":"222"},{"[email protected]":"333","Number":"333"}]} 

如果我改變類型:

type Customer = { Name: string ; Telephone: string } 

它輸出的Json我希望:

{"Name":"Superhero","Phones":[{"Number":"111"},{"Number":"222"},{"Number":"333"}]} 

但WPF綁定拋出此異常:

一雙向或OneWayToSource結合不能對只讀屬性

這項工作是我用來生成的代碼Json C#:

var phonelist = new List<PhoneNumber> { new PhoneNumber("111"), 
             new PhoneNumber("222"), 
             new PhoneNumber("333") 
             }; 
var fsharpList = Microsoft.FSharp.Collections.ListModule.OfSeq(phonelist); // TODO: Use a Extension Method 

var c = new EntidadesFS.DO.Customer(name: "Superhero", phones: fsharpList); 
var json = Newtonsoft.Json.JsonConvert.SerializeObject(c); 

爲什麼會發生這種情況?
如何僅輸出屬性名稱,使用可變,沒有@末尾?
或如何解決這個問題?

+1

問題只是'@'符號被附加到名稱上,或者是屬性被重複並且'@'符號附加到其中一個副本的名稱上? – dbc

+2

不是'F#'dev,但是因爲這是'JSON.Net',你試過[JsonPropertyAttribute](https://www.newtonsoft.com/json/help/html/JsonPropertyName.htm)還是看看[這些] (https://stackoverflow.com/q/20982294/304683) – EdSF

回答

3

基礎上的寶貴意見對這個問題,並與一些更多的搜索
我能夠找到一個解決方案:更好

[<CLIMutable>] 
[<JsonObject(MemberSerialization = MemberSerialization.OptIn)>] 
type Customer = { 
        [<JsonProperty>] mutable Name: string 
        [<JsonProperty>] mutable Phones: PhoneNumber list 
       } 
       and [<CLIMutable>] 
        [<JsonObject(MemberSerialization = MemberSerialization.OptIn)>] 
        PhoneNumber = { 
            [<JsonProperty>] mutable Number: string 
           } 

,或者甚至,如果我繼續等領域不可變的(F#默認) ,
我只需要添加[<CLIMutable>]屬性:

[<CLIMutable>] 
type Customer = { 
        Name: string 
        Phones: PhoneNumber list 
       } 
       and 
        [<CLIMutable>]     
        PhoneNumber = { 
            Number: string 
           } 

輸出:

{"Name":"Superhero","Phones":[{"Number":"111"},{"Number":"222"},{"Number":"333"}]} 

現在,這產生的Json預期,並且也與WPF綁定效果很好。