如何使用C#反序列化JSON

时间:2011-06-02 13:28:27

标签: c# asp.net json serialization

我目前正在使用Json.Net来反序列化我的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或任何其他库)

4 个答案:

答案 0 :(得分: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>(请参阅其他答案)或为错误创建自定义类。有关对JSON进行序列化和反序列化Collection的信息,请参阅http://james.newtonking.com/projects/json/help/SerializingCollections.html

答案 1 :(得分:3)

问题是你正在尝试将字典转换为数组。尝试将string[]替换为Dictionary<string, string>

答案 2 :(得分: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"]}

否则您可能需要一些中间映射。

答案 3 :(得分: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();
        }
    }
}