【问题标题】:How to Deserialize a Json Array with C#?如何使用 C# 反序列化 Json 数组?
【发布时间】:2019-12-19 14:00:07
【问题描述】:

我使用 RestSharp 进行 Rest API 调用。

public class GetValues
{
    public string Values{ get; set; }
}

public class JsonObjects
{
    public List<GetValues> Values{ get; set; }
}

RestRequest restRequest = new RestRequest("api/tempCatalog/temp1", Method.GET);

restRequest.AddHeader("Accept", "application/json");
restRequest.AddHeader("Content-Type", "application/json");
restRequest.AddHeader("Authorization", token);

IRestResponse restResponse = clientRest.Execute(restRequest );
string Content = restResponse.Content;

JsonObjects.Values= JsonConvert.DeserializeObject<JsonObjects>(Content).Values;

我有上面的代码,它可以工作。

但是当 JSON Rest Response 包含一个数组时,它会在反序列化时抛出一个异常。

当 Rest Response 是这样的时候,有时,

{ "Fields": [ "Value.temp", ] } 

我得到了这个例外:

Newtonsoft.Json.JsonSerializationException: '错误转换值'

ArgumentException:无法从 System.String 转换或转换为 Namespace.GetValues。

当我说有时我的意思是我在多个 API 调用中使用这个反序列化时,这个问题只是一个例子

这些是我作为 Rest 响应的一些 Json 数组,我想反序列化它们。

{
  "Fields": [

    "Temp1.Value",
    "Temp2.Value",
    "Temp3.Value",
    "Temp4.Value"
  ]

}

还是这些??

{

  "Errors":
 [
    
{

      "ErrorCode": "Temp Number",
      "Message": "Temp Message",
      "TempName": "Name"
    }

  ],


  "ValueErrors": []

}

还是这些??

{
  
"Total": 1,
  
"Categories": [
    
{

      "Id": "tempID",
      "Name": "tempName"
    }

  ]

}

【问题讨论】:

  • 我编辑了我的问题,你现在能帮我吗??
  • 有人帮忙吗??
  • 一个问题:这些响应是否来自完全相同的 url?它们具有非常不同的结构。我们可以将它们组合成一个响应,但这会增加代码的复杂性。

标签: c# json json.net restsharp json-deserialization


【解决方案1】:

如果我没看错,你会得到以下 JSON 字符串:

{ 
    "Fields": [ 
        "Value.temp", 
    ] 
}

您要反序列化的类必须与此结构匹配,不幸的是,您的类不匹配。

所以JsonObjects 必须是这样的:

public class JsonObjects
{
    public List<string> Fields { get; set; }
}

【讨论】:

  • 你的意思是“字符串”字段?
  • 如果 JSON 与上面的不完全一样,请在您的问题中反映它。这样我们就可以展示如何更好地组织你的课程。但总的来说,您应该在 JSON 和您要反序列化的类之间有确切的对应关系。
  • 同意。如果有多个可能的 JSON 结构,那么您需要多个 C# 数据结构。每个 C# 结构必须匹配一个 JSON 结构。期望不同类型的 JSON 适合单个 C# 结构在逻辑上是不可能的。你能把一个三角形塞进一个方形的洞里吗?
  • 这不是这个问题的答案,我已经编辑了我的问题以帮助解决这个问题,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 2016-05-30
相关资源
最近更新 更多