如何在Asp.net ApiController和UWP app

时间:2017-04-13 22:08:26

标签: c# json serialization uwp json-deserialization

我正在尝试开发一个包含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?

1 个答案:

答案 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();

我可能需要重新考虑删除反斜杠,以防内容中有任何合法内容。