【问题标题】:ASP.NET HttpClient.GetStreamAsync() is not serializableASP.NET HttpClient.GetStreamAsync() 不可序列化
【发布时间】:2017-12-11 22:06:13
【问题描述】:

美好的一天。

我正在尝试向 API 发出 GET 请求。该请求返回一个电话记录数组。

这里是电话类:

public enum OS { Android, IOS, WindowsPhone }
public enum MANIFACTURER { Apple, Nokia, Samsung }

public class Phone
{
    public int ID { get; set; }
    public string Model { get; set; }
    public double Price { get; set; }
    public MANIFACTURER Manifacturer { get; set; }
    public OS OS { get; set; }
    public int RAM { get; set; }
    public int Storage { get; set; }
    public double ScreenSize { get; set; }
    public double CameraResolution { get; set; }
    public bool IsAvailable { get; set; }
}

使用 HttpClient,GetStreamAsync 的直接返回包含所需的数据,但不能作为 List 提取(我得到一个空值电话记录数组):

    [HttpGet]
    public async Task<object> GetPhonesAsync()
    {
        var client = new HttpClient();
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));


        var response = await client.GetStreamAsync("http://localhost:50002/samsung-api/samsungphones/");

        var serializer = new DataContractJsonSerializer(typeof(List<Phone>));
        List<Phone> phones = serializer.ReadObject(response) as List<Phone>;

        //return response;
        return phones;
    }

返回是:

[{"id":0,"model":null,"price":0.0,"manifacturer":0,"os":0,"ram":0,"storage":0,"screenSize":0.0,"cameraResolution":0.0,"isAvailable":false},{"id":0,"model":null,"price":0.0,"manifacturer":0,"os":0,"ram":0,"storage":0,"screenSize":0.0,"cameraResolution":0.0,"isAvailable":false},{"id":0,"model":null,"price":0.0,"manifacturer":0,"os":0,"ram":0,"storage":0,"screenSize":0.0,"cameraResolution":0.0,"isAvailable":false},{"id":0,"model":null,"price":0.0,"manifacturer":0,"os":0,"ram":0,"storage":0,"screenSize":0.0,"cameraResolution":0.0,"isAvailable":false},{"id":0,"model":null,"price":0.0,"manifacturer":0,"os":0,"ram":0,"storage":0,"screenSize":0.0,"cameraResolution":0.0,"isAvailable":false},{"id":0,"model":null,"price":0.0,"manifacturer":0,"os":0,"ram":0,"storage":0,"screenSize":0.0,"cameraResolution":0.0,"isAvailable":false},{"id":0,"model":null,"price":0.0,"manifacturer":0,"os":0,"ram":0,"storage":0,"screenSize":0.0,"cameraResolution":0.0,"isAvailable":false},{"id":0,"model":null,"price":0.0,"manifacturer":0,"os":0,"ram":0,"storage":0,"screenSize":0.0,"cameraResolution":0.0,"isAvailable":false},{"id":0,"model":null,"price":0.0,"manifacturer":0,"os":0,"ram":0,"storage":0,"screenSize":0.0,"cameraResolution":0.0,"isAvailable":false},{"id":0,"model":null,"price":0.0,"manifacturer":0,"os":0,"ram":0,"storage":0,"screenSize":0.0,"cameraResolution":0.0,"isAvailable":false}]

现在如果我返回“响应”而不是“电话”,我会得到:

[{"id":1,"model":"Galaxy J5 Prime","price":569.0,"os":0,"ram":2,"storage":16,"screenSize":5.0,"cameraResolution":13.0,"isAvailable":true},{"id":2,"model":"Galaxy J3 Pro","price":649.0,"os":0,"ram":2,"storage":16,"screenSize":5.0,"cameraResolution":13.0,"isAvailable":false},{"id":3,"model":"Galaxy J7 Core","price":664.0,"os":0,"ram":2,"storage":16,"screenSize":5.5,"cameraResolution":13.0,"isAvailable":true},{"id":4,"model":"Galaxy A3","price":854.0,"os":0,"ram":2,"storage":16,"screenSize":4.7,"cameraResolution":13.0,"isAvailable":true},{"id":5,"model":"Galaxy A5","price":1139.0,"os":0,"ram":3,"storage":32,"screenSize":5.2,"cameraResolution":16.0,"isAvailable":true},{"id":6,"model":"Galaxy A7","price":1329.0,"os":0,"ram":3,"storage":32,"screenSize":5.7,"cameraResolution":16.0,"isAvailable":true},{"id":7,"model":"Galaxy S7 Edge","price":1799.0,"os":0,"ram":4,"storage":32,"screenSize":5.5,"cameraResolution":12.0,"isAvailable":false},{"id":8,"model":"Galaxy S7","price":1899.0,"os":0,"ram":4,"storage":32,"screenSize":5.1,"cameraResolution":12.0,"isAvailable":true},{"id":9,"model":"Galaxy S8","price":2469.0,"os":0,"ram":4,"storage":64,"screenSize":5.8,"cameraResolution":12.0,"isAvailable":true},{"id":10,"model":"Galaxy Note 8","price":2849.0,"os":0,"ram":6,"storage":64,"screenSize":6.3,"cameraResolution":12.0,"isAvailable":true}]

请指出我如何正确地从流中提取 Phone 对象。 非常感谢。

【问题讨论】:

  • Phone 类是如何定义的?
  • @MarcinJuraszek 添加了。
  • ..不等待回复就尝试退回手机?

标签: asp.net stream httpclient


【解决方案1】:

我知道这个问题很老了,但是由于没有解决方案而且我也遇到过类似的问题,所以我是这样解决空对象的。

问题是当您使用 Runtime.Serialization 中的 DataContractJsonSerializer 时,关联的模型类必须具有适当的属性,如下所示:

[DataContract(Name = "Product")]
    public class Product
    {
        [DataMember(Name = "productId")]
        public int ProductId { get; set; }
    }

DataContract 属性用于模型类,DataMember 属性用于其变量,匹配等效的 JSON 键。在您的情况下,它看起来像这样:

[DataContract(Name = "Phone")]
public class Phone
{
    [DataMember(Name = "id")]
    public int ID { get; set; }
    [DataMember(Name = "model")]
    public string Model { get; set; }
    [DataMember(Name = "price")]
    public double Price { get; set; }
    [DataMember(Name = "manifacturer")]
    public MANIFACTURER Manifacturer { get; set; }
    [DataMember(Name = "os")]
    public OS OS { get; set; }
    [DataMember(Name = "ram")]
    public int RAM { get; set; }
    [DataMember(Name = "storage")]
    public int Storage { get; set; }
    [DataMember(Name = "screenSize")]
    public double ScreenSize { get; set; }
    [DataMember(Name = "cameraResolution")]
    public double CameraResolution { get; set; }
    [DataMember(Name = "isAvailable")]
    public bool IsAvailable { get; set; }
}

您的控制器代码现在应该按预期工作,返回一个填充的电话对象列表。

更多信息在这里: https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-serialize-and-deserialize-json-data

【讨论】:

    猜你喜欢
    • 2011-04-06
    • 2023-04-09
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2014-05-16
    相关资源
    最近更新 更多