反序列化变量json格式

时间:2013-09-03 22:21:04

标签: c# json deserialization

当我尝试反序列化不完全以相同格式存在的JSON时,我遇到了问题。我得到的JSON就是这样的(为了清晰起见而修剪):

{  
  "header": {  
    "code": "4",  
    "description": "Input Validation Error",  
    "errors": {  
      "code": "100",  
      "description": "externalServiceCode: must match '[A-Za-z0-9_]+'"  
    }  
  },  
  "externalCode": "259716_TRAVELAC"  
},  
{  
  "header": {  
    "code": "4",  
    "description": "Input Validation Error",  
    "errors": [  
      {  
        "code": "100",  
        "description": "Currency not valid"  
      },  
      {  
        "code": "100",  
        "description": "Can not be empty"  
      }  
    ]  
  },  
  "externalCode": "259716_TRA"  
}  

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

 "errors":{"code":"1","description":"description"}  

或者可能是一个数组:

 "errors":[{....},{....}].  

我对JSON格式没有任何控制权(我得到的服务是由其他公司制作的)。

问题是我找不到一种简单的方法将这个JSON解析为C#。我做了自定义类,如果我把它作为一个简单的对象,我会错过数据,如果有多个错误,如果我认为它是一个数组,如果JSON只有一个错误我没有得到任何东西(请注意,当只有一个时,错误部分中缺少括号[]。

有什么方法可以解决这个问题吗?我尝试过几种方法,但似乎没什么用。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-1)

我想你可以看看this answer。 例如,您需要使用Newtonsoft反序列化您的JSON。

如果您没有创建课程,可以复制JSON并点击Paste as JSON

  

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