【发布时间】:2017-09-10 04:18:06
【问题描述】:
我正在尝试开发一个包含 UWP 前端的解决方案,该前端从 Azure 托管的 asp.net ApiController 获取数据,理想情况下我希望以 JSON 格式发送数据。
架构相当简单,我有一组 POCO(非复杂类作为我的 DTO)。
因为解决方案有两个部分,其中之一是 UWP,所以我制作了两组 POCO,因为我还没有尝试过制作“便携式”类库。从记忆中,我之前使用过这种方法没有问题,但那是使用(不确定正确的短语是什么)“本机”/二进制序列化而不是 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?
【问题讨论】:
-
可以使用 newtoSoft json 吗?它有属性可以设置UWP有Asp可以使用规则。
-
您的“JSON”实际上是一个包含 JSON 的 XML 序列化字符串文字。 1)与其序列化自己,不如让框架来做,否则你会得到像this question一样的双重序列化响应。 2) 要让您的 Web API 返回 JSON,请参阅 stackoverflow.com/q/12629144/3744182 或 stackoverflow.com/q/9847564/3744182
-
XML 是信封,它是我要反序列化的 JSON 负载。
标签: c# json serialization uwp json-deserialization