System.Text.Json JsonSerializer:不支持 'System.Type' 个实例的序列化和反序列化

System.Text.Json JsonSerializer: Serialization and deserialization of 'System.Type' instances are not supported


当我尝试使用 `System.Text.Json JsonSerializer` 反序列化时,我遇到了与安全相关的错误。

这是我的一段代码:

public async ValueTask<List<T>> GetJsonAsync(string url) 由于未在方法签名上指定通用信息,因此甚至无法编译。

另外,你的问题可能出在http响应的内容上,否则,Deserialize步骤应该没问题。

我复制了你的代码并做了一个小块来证明它。

// Define somewhere
public class GenericHttpClient
{
    public List<T> GetJsonAsync<T>()
    {
        var content = "[{\"TestProp\": \"This is some test\"}]";
        return JsonSerializer.Deserialize<List<T>>(content, new JsonSerializerOptions() { PropertyNameCaseInsensitive=true});
    }
}

public class Test
{
    public string TestProp { get; set; }
}

// Test it
var test = new GenericHttpClient();
var result = test.GetJsonAsync<Test>();
由于安全原因,

System.Text.Json 不支持类型 class。您将完整的程序集名称作为字符串发送,然后再次尝试在客户端构造类型。

就像@Mayur Ekbote 提到的那样,“System.Text.Json 出于安全原因不支持 class 类型。”我会添加一个解决方案,但我认为这个解决方案不是很有效。

  • Type改为Dynamic:

      [Inject]
      private  IGenericHttpClient<dynamic> HttpClient { get; set; }
    
  • 使用JsonElement获取字符串形式的值:

          private async Task OnPropertChange(ChangeEventArgs args)
          {
           var langCode = CultureInfo.CurrentCulture.Name;
           PropertyValueList.Clear();
    
          var list = await HttpClient.GetJsonAsync($"/api/{SelectedType.Name}/all");
          List<object> listValue = new List<object>();
    
          SelectedProperty = args.Value.ToString();
          string fieldName = char.ToLower(SelectedProperty[0]) + SelectedProperty.Substring(1);
          foreach (var item in list)
          {
              //Convert object to JsonElement
              var val = ((JsonElement)item).GetProperty(fieldName).GetString();
              PropertyValueList.Add(val);
    
          }
    
      }
    
  • 为什么效率不高?
    因为我得到了一个值列表 String 而不是选定的列表 class.