美好的一天。
我正在尝试向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对象。 谢谢你。
答案 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对象列表。