2011-06-02 77 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(); 
     } 
    } 
}