2011-06-02 25 views
2

我目前使用Json.Net來反序列化我的JSON。我現在有以下情況:如何使用C去序列化JSON#

我正在以下JSON響應:

{"Success":false,"Errors":{"UserName":"User Name already registered","EmailAddress":"Email Address already registered"}} 

我想將它解析爲這種類型:

public class CustomJsonResult 
{ 
    public bool Success { get; set; } 
    public string[] Errors { get; set; } 
} 

使用Json.net,我試着做這樣的:

CustomJsonResult regResult = JsonConvert.DeserializeObject<CustomJsonResult>(json); 

但是這不工作,我得到的錯誤無法將JSON對象反序列化爲類型'System.String []'。

我該如何解決這個問題? (使用Json.Net或任何其他文庫)

回答

3

問題是你正試圖將字典轉換爲數組。嘗試用Dictionary<string, string>替換您的string[]

+0

這個工作最好。我可能會得到一個額外的錯誤對象。 – robasta 2011-06-02 13:51:48

+0

@Robert Dondo是否意味着'Error'對象可能有不同的字段,或者JSON中'Errors'字段中可能有更多'Error'對象? – OnesimusUnbound 2011-06-02 13:55:21

+0

錯誤對象可能具有額外(或更少)字段。我在發表最初的帖子時沒有考慮過這個問題。 – robasta 2011-06-02 14:01:45

3

Errors不是串的陣列,它是一個與objectUserNameEmailAddress,因爲它的特性。

{ 
    "Success":false, 
    "Errors":{ 
     "UserName":"User Name already registered", 
     "EmailAddress":"Email Address already registered" 
    } 
} 

好了,你可以創建另一個類來存儲錯誤信息

public CustomJsonError 
{ 
    public string UserName { get; set; } 
    public string EmailAddress { get; set; } 
} 

然後重構類

public class CustomJsonResult 
{ 
    public bool Success { get; set; } 
    public CustomJsonError Errors { get; set; } // I'm not sure if the property should be named as Errors 
} 

BTW,就會報錯包含錯誤的數組/列表?

更新

好了,你可以使用Dictionary<string, string>(見其他答案)或錯誤創建自定義類。請參閱http://james.newtonking.com/projects/json/help/SerializingCollections.html,以便將JSON序列化和反序列化集合。

1

這是因爲您的JSON中的「錯誤」與它試圖反序列化的內容不匹配。它應該是這樣的:

public class CustomJsonResult 
{ 
    public bool Success { get; set; } 
    public ErrorType[] Errors { get; set; } 
} 

public class ErrorType 
{ 
    public string UserName {get;set;} 
    public string EmailAddress {get;set;} 
} 

如果你想改變JSON匹配,它應該是這個樣子:

{"Success":false, "Errors": ["User Name already registered", "Email Address already registered"]} 

否則,你可能需要一些中間映射。

1

從標準.net庫中System.Web.Extensions程序使用JavaScriptSerializer:

using System; 
using System.Collections.Generic; 
using System.Web.Script.Serialization; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var dict = new JavaScriptSerializer().Deserialize<Dictionary<string,int>>("{ a: 1, b: 2 }"); 
      Console.WriteLine(dict["a"]); 
      Console.WriteLine(dict["b"]); 
      Console.ReadLine(); 
     } 
    } 
}