2013-08-29 31 views
10

一個C#對象我從web服務的以下響應:如何使從JSON

{ 
    "data":{ 
    "foo.hugo.info": { 
     "path": "logon.cgi", 
     "minVersion": 1, 
     "maxVersion": 2 
    }, 
    "foo.Fritz.Task": { 
     "path": "Fritz/process.cgi", 
     "minVersion": 1, 
     "maxVersion": 1 
    } 
    }, 
    "success": true 
} 

必須如何JSON對象模樣反序列化呢?

或者有另一種方法來獲取屬性的值?

+0

你想反序列化它嗎? – Shaharyar

+0

一旦你將這些信息加入到你的程序中,你想怎麼做?雖然您可以將它反序列化爲一個對象,但這可能是您可以避免的工作,具體取決於您的目標。 –

+0

你已經有了一個JSON對象。你的意思是如何將它翻譯成C#對象?如果是這樣,用屬性'path','minVersion','maxVersion'來創建一個類,並使用類似JSON.NET的方式進行反序列化。 –

回答

7

隨着JSON.NET庫這是很簡單的:

public class Root 
{ 
    public Dictionary<string, Data> Data { get; set; } 
    public bool Success { get; set; } 
} 

public class Data 
{ 
    public string Path { get; set; } 
    public int MinVersion { get; set; } 
    public int MaxVersion { get; set; } 
} 

然後:

string json = 
@"{ 
    ""data"":{ 
    ""foo.hugo.info"": { 
     ""path"": ""logon.cgi"", 
     ""minVersion"": 1, 
     ""maxVersion"": 2 
    }, 
    ""foo.Fritz.Task"": { 
     ""path"": ""Fritz/process.cgi"", 
     ""minVersion"": 1, 
     ""maxVersion"": 1 
    } 
    }, 
    ""success"": true 
}"; 
Root root = JsonConvert.DeserializeObject<Root>(json); 

在這個例子中我使用了一個Dictionary<string, Data>對象到2個複雜鍵(foo.hugo.infofoo.Fritz.Task),因爲模型它們包含不能在.NET成員中使用的名稱。

+0

downvote的任何原因?當downvoting解釋爲什麼這個答案是錯誤的,請留下評論。 –

+0

它正是我所需要的!它也使用字典,可以處理兩個以上的數據條目。謝謝! – GreenEyedAndy

1

看看這個網站:http://json2csharp.com/

粘貼在JSON字符串,它會生成類爲您服務。我通常在JSON.NET中使用這個來反序列化一個根對象的實例。

+1

JSON.NET主頁:http://json.codeplex.com/ – valverij

+1

請仔細看看JSON並注意'foo.hugo.info'和'foo.Fritz.Task'鍵。現在看看你建議爲'Data'類生成的網站 - 非常無用。 –

+0

好點。我以前沒有使用過該網站的問題。 +1爲您的更好的答案。 – stevepkr84

5

如果你正在使用VS2012或以上,你可以做到以下幾點:

Edit > Paste Special > Paste JSON As Classes 

你的榜樣,這導致:

public class Rootobject 
{ 
    public Data data { get; set; } 
    public bool success { get; set; } 
} 

public class Data 
{ 
    public FooHugoInfo foohugoinfo { get; set; } 
    public FooFritzTask fooFritzTask { get; set; } 
} 

public class FooHugoInfo 
{ 
    public string path { get; set; } 
    public int minVersion { get; set; } 
    public int maxVersion { get; set; } 
} 

public class FooFritzTask 
{ 
    public string path { get; set; } 
    public int minVersion { get; set; } 
    public int maxVersion { get; set; } 
} 
+1

任何代碼示例,您可以使用什麼序列化程序將OP中顯示的JSON反序列化爲這些類?我對'foohugoinfo'和'fooFritzTask'屬性特別感興趣。 –

+0

這可能不會完全回答OP的問題,但我必須說... mind = blown。直到現在,我還不知道在編輯菜單下潛伏着什麼。 –

+2

這不靈活,如果添加了第三個變體,則需要創建另一個類並將其作爲屬性添加到Data類中。 – christiandev

1

您可以使用DataContractJsonSerializer

[DataContract] 
    public class DetailedData 
    { 
     [DataMember(Name="path")] 
     public string Path { get; set; } 
     [DataMember(Name = "minVersion")] 
     public int MinVersion { get; set; } 
     [DataMember(Name = "maxVersion")] 
     public int MaxVersion { get; set; } 
    } 

    [DataContract] 
    public class Data 
    { 
     [DataMember(Name = "foo.hugo.info")] 
     public DetailedData Info { get; set; } 
     [DataMember(Name = "foo.Fritz.Task")] 
     public DetailedData Task { get; set; } 
    } 

    [DataContract] 
    public class RootObject 
    { 
     [DataMember(Name = "data")] 
     public Data Data { get; set; } 
     [DataMember(Name = "success")] 
     public bool Success { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     string json = "..."; 
     DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(RootObject)); 

     RootObject obj = (RootObject)js.ReadObject(new MemoryStream(Encoding.Unicode.GetBytes(json))); 
     Console.WriteLine(obj.Data.Task.MaxVersion); 
    } 

編輯:同類InfoTask

+0

你可以用'Info'和'Task'使用同一個類。除此之外,好的和完整的答案,+1。 –

+0

我剛剛完成編輯:) –

+0

這很好,但我忘了寫的是數據:是動態的。它可以是任何不同項目的計數,但每次都有路徑,minVersion和maxVersion成員。只有名稱(foo.hugo.info/foo.fritz.task)可以變化。 – GreenEyedAndy