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

本文关键字:反序列化 JSON 数组 | 更新日期: 2023-09-27 18:03:37

我正在努力在这个论坛上有很多变体,但我似乎找不到一个适合我的主题,我认为这是因为我的JSON数组的方式:(我不是专家,但我已经设法"几乎"得到结束…我需要得到手在"状态"answers"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。"Status"和它的元素组成一个对象和

2。"ListofCredDetails"和它的元素列表到一个对象

,然后为"GetUserCredentialDetailsReturn"创建对象,以同时返回状态(对象)和ListofCredDetails(对象)。

谁能帮助我理解我如何才能实现这一点,我已经尝试了一些像下面的反序列化,并得到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; 
        }
    }

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

您需要首先将类GetUserCredentialDetailsReturn中的属性名称更改为status和listOfCredDetails。

然后你可以尝试用下面的代码将Json反序列化到你的类GetUserCredentialDetailsReturn中。

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

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

   // result.Status
   // result.ListofCredDetails

[Serializable]
public class GetUserCredentialDetailsReturn
{
    public StatusReturn status { get; set; }
    public List<CredDetailsReturn> listOfCredDetails { get; set; }
}
JsonConvert.Deserialize<GetUserCredentialDetailsReturn>(json_string)

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

using Newtonsoft.Json;

然后创建一个解析器来读取JSON token:

var reader = new JsonTextReader(...);

你会得到一个一个的token:

    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();
    }

这个技术在每一本关于构建编译器的书中都有解释