如何使用C#取消序列化JSON

本文关键字:序列化 JSON 取消 何使用 | 更新日期: 2023-09-27 17:58:26

我目前正在使用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或任何其他库)

如何使用C#取消序列化JSON

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

Errors不是字符串数组,它是object,属性为UserNameEmailAddress

{
    "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
}

顺便说一句,error会包含一个错误数组/列表吗?

更新

好吧,您可以使用Dictionary<string, string>(参见其他答案)或为Error创建一个自定义类。看见http://james.newtonking.com/projects/json/help/SerializingCollections.html用于将Collection序列化到JSON和从JSON反序列化Collection。

这是因为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"]}

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

使用标准.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();
        }
    }
}