【问题标题】:Is it possible to deserialize System.Text.Encoding class from JSON to code in C#?是否可以将 System.Text.Encoding 类从 JSON 反序列化为 C# 中的代码?
【发布时间】:2019-08-22 21:46:49
【问题描述】:

我有一个类,我通过我的 Web API 控制器将它作为 JSON 对象返回。

public class ModelClass
{
   public string QueryString {get; set;}
   public Encoding Encoding {get; set;}

   public BankLinkModel(string queryString , Encoding encoding)
   {
      this.QueryString = queryString ;
      this.Encoding = encoding;
   }
}

但是当我尝试使用我的代码在另一个应用程序(进行 API CALL)中反序列化这个模型时:

var responseFromApi = ApiClient.get(string.Format("some/magic/url?id={0}", "663"));
var query = responseFromApi.Content.ReadAsAsync<ModelClass>().Result;

我收到一个错误:

类型是接口或抽象类,不能实例化。

这是因为System.Text.Encoding 是一个抽象类。有没有办法让我反序列化 System.Text.Encoding 类?

【问题讨论】:

  • 内容的编码应该设置在适当的HTTP头上,作为参数传递。
  • 如何返回结果? Web API 应该自动处理编码和代码页
  • 我们所有的请求都使用 UTF-8 编码,但是对于这个精确的请求,我需要获取编码类,因为我将向第 3 方应用程序发出另一个请求,这不需要UTF-8 编码,但一种特殊的编码(不是标准)
  • 然后用 that 请求发送不同的Accept-Charset 标头。 Web API 检查此标头以确定响应的字符集。你用的是什么字符集? Web API 可以处理几乎所有的编码,除非它是新发明的。即使这样,合规的方法是设置Accept-Charset 并在控制器的方法中检查其值。这将确保您的 API 适用于任何客户端
  • 同样的问题之前是answered in S/O。希望对您有所帮助。

标签: c# json serialization


【解决方案1】:

您可以序列化Encoding.EncodingName 属性,并在反序列化时调用Encoding.GetEncoding(name) 方法来创建实例,而不是序列化Encoding 实例。

【讨论】:

  • 你能解释更多吗?编码名称是什么意思?是 Encoding.BodyName, Encoding.HeaderName 吗?
  • 更好的是,设置适当的响应标头。顺便说一句,如果做出正确的响应调用,Web API 应该自动设置这些。为什么要发送编码?
  • @SomeGuy 我应该说清楚的。它是Encoding.EncodingName 属性。
  • @PanagiotisKanavos 我应该承认我对 Web 编程知之甚少。我的回答是基于“如何序列化编码”的问题。如果您能写出自己的答案来描述正确的方式,我将不胜感激。
  • 遗憾地传递 Encoding.EncodingName 对我不起作用。我收到一个错误:“Baltic (Windows)”不是受支持的编码名称。
【解决方案2】:

Sriram Sakthivel 的回答最终没有奏效(参见 cmets),但序列化不同属性背后的基本思想是正确的方法。

序列化Encoding.WebName,而不是使用Encoding.EncodingNameEncoding.GetEncoding( string name ) 接受来自 WebName 属性的值:

首选编码的代码页名称。 WebName 属性返回的任何值都是有效的。可能的值列在编码类主题中出现的表的名称列中。

所以反序列化变成Encoding.GetEncoding( "utf-8" )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多