ASP.NET HttpClient.GetStreamAsync()不可序列化

时间:2017-12-11 22:06:13

标签: asp.net stream httpclient

美好的一天。

我正在尝试向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}]

现在,如果我回复&#34;回复&#34;而不是&#34;手机&#34;我明白了:

[{"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对象。 谢谢你。

1 个答案:

答案 0 :(得分:0)

我知道这个问题很旧,但是由于没有解决方案,并且经历过类似的问题,因此这是我解决空对象的方法。

问题是,当您从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; }
}

您的控制器代码现在应该可以按预期工作,并返回填充的Phone对象列表。

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