【问题标题】:How to serialize/deserialize JSON arrays / pass arrays between Asp.net ApiController and UWP app如何序列化/反序列化 JSON 数组/在 Asp.net ApiController 和 UWP 应用程序之间传递数组
【发布时间】: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/3744182stackoverflow.com/q/9847564/3744182
  • XML 是信封,它是我要反序列化的 JSON 负载。

标签: c# json serialization uwp json-deserialization


【解决方案1】:

这行得通。我遇到的问题是(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();

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

【讨论】:

    猜你喜欢
    • 2018-12-18
    相关资源
    最近更新 更多