如何使用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或任何其他库)
问题是您正试图将字典转换为数组。尝试将string[]
替换为Dictionary<string, string>
。
Errors
不是字符串数组,它是object
,属性为UserName
和EmailAddress
。
{
"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();
}
}
}