C# 反序列化变量json格式

C# 反序列化变量json格式,c#,json,deserialization,C#,Json,Deserialization,当我试图反序列化一个JSON时,我会遇到一些问题,而JSON的格式并不总是相同的。我得到的JSON是这样的(为了清晰起见进行了修剪): 如您所见,“errors”值可能很简单: "errors":{"code":"1","description":"description"} 或者可能以数组形式出现: "errors":[{....},{....}]. 我对JSON格式没有任何控制权(我得到的服务是由另一家公司提供的) 问题是我找不到一种简单的方法将这个JSON解析成C。我制作了

当我试图反序列化一个JSON时,我会遇到一些问题,而JSON的格式并不总是相同的。我得到的JSON是这样的(为了清晰起见进行了修剪):

如您所见,“errors”值可能很简单:

 "errors":{"code":"1","description":"description"}  
或者可能以数组形式出现:

 "errors":[{....},{....}].  
我对JSON格式没有任何控制权(我得到的服务是由另一家公司提供的)

问题是我找不到一种简单的方法将这个JSON解析成C。我制作了自定义类,如果我尝试它作为一个简单的对象,如果有多个错误,我会错过数据,如果我把它看作一个数组,如果JSON只有一个错误,我就什么也得不到(请注意,当只有一个错误部分时,在错误部分中注意缺少的括号[])。
有什么办法解决这个问题吗?我试过几种方法,但似乎都不管用。

我想你可以看看。 例如,您需要使用Newtonsoft对JSON进行反序列化

如果没有创建类,可以复制JSON并单击

“将JSON粘贴为类”是ASP.NET和Web工具中的一项很酷的功能 2012.2 RC。此功能将帮助您从有效的JSON文本生成C#或VB.NET中的强类型类

使用,您可以动态处理json

string json1 = @"{""errors"":{""code"":""1"",""description"":""description""}}";
string json2 = @"{""errors"":[{""code"":""1"",""description"":""description""},{""code"":""2"",""description"":""description""}]}";

var obj = JObject.Parse(json1 or json2);

if (obj["errors"] is JArray)
{
    foreach (var error in obj["errors"])
    {
        Console.WriteLine(error["code"].ToString());
    }
}
else
{
    Console.WriteLine(obj["errors"]["code"].ToString());
}

我使用的是VS2008,而不是ASP.NET或Web Tools 2012。我自己创建了我的类,还尝试了json2csharp,但得到了相同的结果。另外,我尽量避免使用Json.Net(Newtonsoft)等任何第三方LIB,但我要看一看。VS 2008和ASP.Net不一样,一个是IDE,另一个是技术。您可以在VS中创建一个空的ASP.Net项目来自动生成代码。我可以理解,您试图避免第三方,但如果存在免费和广泛使用的替代方案,那么编写自定义库是没有意义的。您的JSON非常干净,但是如果明天您收到许多数组,您的代码将变得非常复杂,如果您的库没有得到很好的实现,您可能很快就会出现性能问题。如果您仍然不想依赖第三方库,您可以看看它们是如何实现的。您使用的是哪种反序列化程序?Json.NET?其他的?不管怎样,考虑把一个“错误”转换成一个“错误”数组,并将其处理为一个错误对象序列。通过使用解析机制和/或使用单独的JSON->JSON规范化器,这一点的实现方式将有所不同。我试图避免使用第三方libs作为Json.Net。我知道最简单的方法是将单个“错误”规范化为一个数组,但这是由另一家公司完成的,我不能更改它。@prf我建议使用Json.NET-这仍然是我的目标。我相信这可以通过为自定义[反]序列化程序使用一个或非序列化属性和条件(或两者的组合)来处理。
string json1 = @"{""errors"":{""code"":""1"",""description"":""description""}}";
string json2 = @"{""errors"":[{""code"":""1"",""description"":""description""},{""code"":""2"",""description"":""description""}]}";

var obj = JObject.Parse(json1 or json2);

if (obj["errors"] is JArray)
{
    foreach (var error in obj["errors"])
    {
        Console.WriteLine(error["code"].ToString());
    }
}
else
{
    Console.WriteLine(obj["errors"]["code"].ToString());
}