【问题标题】:JsonConvert.DeserializeObject File into a model class web api .net coreJsonConvert.DeserializeObject 文件转换成模型类 web api .net core
【发布时间】:2020-07-21 16:25:50
【问题描述】:

我正在使用 C# .netcore 创建一个 WebAPI。我有一种方法可以根据文件 ID 从 URL 获取文件流(不同类型)

function async Task<T> GetFile(string id) {
   HttpRequestMessage request = new HttpRequestMessage();
   request.RequestUri = new Uri("serverURL" + id);
   request.Method = HttpMethod.Get;
   HttpResponseMessage response = await httpClient.SendAsync(request, 
   HttpCompletionOption.ResponseContentRead, cancelToken);
   var result = await response.Content.ReadAsStringAsync();
   return JsonConvert.DeserializeObject<T>(result);
}

我想将结果返回到这样的模型中

public class FileModel
{
    public HttpResponseMessage File { get; set; }
}

我将之后的结果转换为base64以获取文件。

我收到此错误 解析值时遇到意外字符:B. Path '', line 0, position 0 因为 JsonConvert 无法将结果转换为我的 FileModel 类。我不能在方法中使用 HttpResponseMessage 代替,方法应该是通用的。

谢谢

【问题讨论】:

  • serverURL 最后应该是反斜杠
  • 私有异步任务 GetFile(string id)

标签: c# .net-core asp.net-core-webapi


【解决方案1】:

您是否检查过您的 Json 格式是否正确。 看来,您的“结果”格式不正确。

JsonConvert.DeserializeObject(result) 期待正确的 Json,否则会返回错误。

  1. 检查Json结构是否正确:http://jsonlint.com/
  2. 从 Json 结构生成类:https://app.quicktype.io/?l=csharp

【讨论】:

【解决方案2】:

您的 FileModel 不应具​​有 HttpResponseMessage 类型的属性,因为这不是 Json 反序列化器将返回的内容。它将尝试根据您使用的通用模型 (T) 将该 JSON 转换为一个类。通用模型 (T) 的结构必须与返回的 JSON 匹配。

例如,如果你的 json 看起来像这样:

{
 field1: "value1",
 field2: 123
}

你的模型应该是这样的

public class MyModel {
  string field1 { get; set;}
  int field2 { get; set;}
}

如果你的 api 调用的结果是不同的模型,那么你需要为每个调用创建一个新的模型。您不应尝试对所有呼叫使用相同的模型。

【讨论】:

  • { field1: "value1", field2: 123 } 是我的请求,而结果是二进制文件
  • 如果结果是二进制文件,那么您不应该尝试使用 JSON 对其进行反序列化。您应该使用 FileStream 来读取它
猜你喜欢
  • 2019-03-26
  • 2022-01-06
  • 2021-06-30
  • 1970-01-01
  • 2021-08-09
  • 2017-12-18
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
相关资源
最近更新 更多