我正在尝试开发一个包含UWP前端的解决方案,该前端从Azure托管的asp.net ApiController获取数据,理想情况下我想以JSON格式发送数据。 / p>
架构非常简单,我有一套POCO(非复杂类作为我的DTO' s)。
因为该解决方案有两个部分,其中一个是UWP,我已经制作了两套POCO,因为我还没有尝试制作制作' Portable&#39 ;班级图书馆。从内存中我以前没有使用过这种方法,但是使用(不确定正确的短语是什么)" native" /二进制序列化而不是JSON来序列化和反序列化。
在控制器中序列化数据没有问题:
using using System.Web.Script.Serialization;
array = new CurrentSpendInfo[someCostCodes.Count()];
foreach (CostCodeInfo c in someCostCodes)
{
info = new CurrentSpendInfo();
array[i] = info;
info.CostCodeName = c.CostCodeName;
info.AnnualBudget = c.Budget;
...
}
return new JavaScriptSerializer().Serialize(array);
创建JSON:
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
[{"CostCodeName":"Food","AnnualBudget":20000,"AnnualSpentToDate":0,"AnnualRemainigBalance":20000,"AnnualSpendAsPercentage":0,"EstMonthlyBudget":0,"EstMonthlyBudgetToDate":0,"TotalVariance":0,"ActualAverageMonthlySpend":NaN,"ActualMonthlySpendToDateAsPercentage":NaN,"TransactionCount":0,"Avg":0,"Min":0,"Max":0,"CostCodeUID":"255697c8-b05e-436b-9b37-09593348bb32"},
{"CostCodeName":"Travel","AnnualBudget":6000,"AnnualSpentToDate":0,"AnnualRemainigBalance":6000,"AnnualSpendAsPercentage":0,"EstMonthlyBudget":0,"EstMonthlyBudgetToDate":0,"TotalVariance":0,"ActualAverageMonthlySpend":NaN,"ActualMonthlySpendToDateAsPercentage":NaN,"TransactionCount":0,"Avg":0,"Min":0,"Max":0,"CostCodeUID":"75b66211-0f58-491e-b119-d4cb212ec9fa"},
{"CostCodeName":"Total","AnnualBudget":26000,"AnnualSpentToDate":0,"AnnualRemainigBalance":26000,"AnnualSpendAsPercentage":0,"EstMonthlyBudget":0,"EstMonthlyBudgetToDate":0,"TotalVariance":0,"ActualAverageMonthlySpend":NaN,"ActualMonthlySpendToDateAsPercentage":0,"TransactionCount":0,"Avg":0,"Min":0,"Max":0,"CostCodeUID":""}]
</string>
问题是在UWP中,阵列没有被反序列化,它在下面显示的最后一行失败:
using Windows.Web.Http;
using Windows.Data.Json;
HttpResponseMessage rspn = await _HttpClient.GetAsync(geturi);
string response = await rspn.Content.ReadAsStringAsync();
JsonArray root = JsonValue.Parse(response).GetArray();
WinRT信息:这不是数组值。使用ValueType属性 获得类型。
附加信息:在意外时间调用了一个方法。
这不是数组值。使用ValueType属性获取类型。
如果存在此异常的处理程序,则程序可能是安全的 继续进行。
如何解决这个问题?
我注意到序列化器谈到了值类型 - 这是否与我的类是引用类型而不是值类型有关?
我应该使用不同的JSON库来进行序列化吗?就我所知,这不是一件微不足道的事情 - 使用Newtonsoft将是理想的,但是它与UWP下的最新版本库之间存在兼容性问题。
或者我是否必须依赖XML?
答案 0 :(得分:0)
这很有用。我遇到的问题是(1)被Visual Studio可视化工具误导(即在运行时查看响应字符串(JSON)),(2)没有修剪周围的双引号,(3)摆脱不需要的反斜杠和(4)删除任何杂散的换行符:
HttpResponseMessage rspn = await _HttpClient.GetAsync(geturi);
string response = await rspn.Content.ReadAsStringAsync();
response = response.Replace(Environment.NewLine, string.Empty);
response = response.Replace(@"\", string.Empty);
response = response.Substring(1, response.Length - 2);
JsonArray root = JsonValue.Parse(response).GetArray();
我可能需要重新考虑删除反斜杠,以防内容中有任何合法内容。