如何在C#中反序列化JSON数组

时间:2015-07-21 05:17:37

标签: c# json serialization

我正在努力研究这个论坛中有很多变种的主题,但我似乎找不到适合我的主题,而且我认为这是因为我的JSON数组是这样的:(我不是专家,但我已经设法“差点”结束..我需要获得“状态”和“listOfCredDetails”值。

我的JSON(称为responseFromServer):

 {
 "Status": {
             "StatusCode":143,
             "SubStatus":0,
             "Description":"Ok"
           },
 "ListofCredDetails":
                  [{
                     "Client":"a",
                     "CredID":111,
                     "CredUserID":"abc"
                   },
                   {
                     "Client":"b",
                     "CredID":112,
                     "CredUserID":"def"
                   },
                   {
                     "Client":"c",
                     "CredID":113,
                     "CredUserID":"ghi"
                   }]
  }

然后,基于这个论坛中的很多例子,我创建了我的课程:

 [Serializable]
 public class StatusReturn
    {
        public int StatusCode { get; set; }
        public int SubStatus { get; set; }
        public string Description { get; set; }
    }


 [Serializable]
public class CredDetailsReturn
{
    public string Client{ get; set; }
    public int CredID{ get; set; }
    public string CredUserID{ get; set; }

}

 [Serializable]
public class GetUserCredentialDetailsReturn
{
    public StatusReturn status;
    public List<CredDetailsReturn> listOfCredDetails;

    public GetUserCredentialDetailsReturn()
    {
        status = new StatusReturn();
        listOfCredDetails = new List<CredDetailsReturn>();

    }
}

然后我要反序列化以获得

1.“状态”及其元素分为一个对象和

2.“ListofCredDetails”及其元素列表到一个对象

然后为“GetUserCredentialDetailsReturn”创建对象,一次返回status(object)和ListofCredDetails(object)。

任何人都可以帮助我理解我是如何实现这一点的我已经尝试了一些类似下面的反序列化并将Json数据分成两个单独的对象。

但它没有用......

public GetUserCredentialDetailsReturn InvokeRequest(RESTInvokeClass objInvoke)
    {

      ...
      ... 
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {

            string responseText = streamReader.ReadToEnd();

            GetUserCredentialDetailsReturn result = new GetUserCredentialDetailsReturn();
            result.status = JsonConvert.DeserializeObject<StatusReturn>(responseText);
            result.listOfCredDetails  = JsonConvert.DeserializeObject<List<CredDetailsReturn>>(responseText);

            return result; 

        }

    }

3 个答案:

答案 0 :(得分:0)

[Serializable]
public class GetUserCredentialDetailsReturn
{
    public StatusReturn status { get; set; }
    public List<CredDetailsReturn> listOfCredDetails { get; set; }
}

JsonConvert.Deserialize<GetUserCredentialDetailsReturn>(json_string)

答案 1 :(得分:0)

如果你只需要一些(比如非常大的)JSON文件的一些孤立元素,你需要JSON库的低级部分,例如来自Newtonsoft:

using Newtonsoft.Json;

然后创建一个解析JSON令牌的解析器:

var reader = new JsonTextReader(...);

您将通过令牌获取令牌:

    private void nextToken()
    {
        do
        {
            if (!reader.Read()) this.importError("unexpected end of file");
        }
        while (reader.TokenType == JsonToken.Comment);
    }

并且必须在Token Parser中处理此问题。例如,如果您读取数组:

    private void readMyArray()
    {
        // StartArray
        if (reader.TokenType != JsonToken.StartArray) this.importError("expected start of array '['");
        this.nextToken();

        while (reader.TokenType != JsonToken.EndArray)
        {
            this.readMyElement();
        }            
        // EndArray
        if (reader.TokenType != JsonToken.EndArray) this.importError("expected end of array ']'");
        this.nextToken();
    }

每本关于构建编译器的书都解释了这种技术。

答案 2 :(得分:0)

您需要先将类GetUserCredentialDetailsReturn中的属性名称更改为Status状态,将listOfCredDetails更改为ListofCredDetails。

然后,您可以尝试通过以下代码将Json反序列化到您的班级GetUserCredentialDetailsReturn

GetUserCredentialDetailsReturn result = new GetUserCredentialDetailsReturn();
result = JsonConvert.DeserializeObject<GetUserCredentialDetailsReturn>(responseText);

您可以在结果中获取您的状态和listOfCredDetails。

   // result.Status
   // result.ListofCredDetails

希望这会对你有所帮助。