【问题标题】:JsonConvert.DeserializeObject<DataTable> throws an exceptionJsonConvert.DeserializeObject<Da​​taTable> 抛出异常
【发布时间】:2018-04-24 16:49:13
【问题描述】:

大家好,

我使用的是 XCode 版本 9.2 (9C40b)、Visual Studio 2017 Pro 15.6.6 和 Xamarin 11.9.1.24 的降级版本。

上下文如下:手机对中间层进行 REST 调用,该中间层查询数据库并返回以 JSON 形式序列化的 DataTable。手机会将内容反序列化为 DataTable。

我正在寻找一种方法来解决这个问题,但没有运气。我看过多个类似的帖子,但没有一个解决方案对我有用。我认为这是 Xamarin 关于 iOS 的限制,如 here 所述。但我想知道是否有办法解决它。这是导致引发异常的代码:

在 ExecuteQuery 函数中我有这段代码

公共异步任务ExecuteQuery() ...

try
{
    var stringContent = new StringContent(JsonConvert.SerializeObject(_Items.query), Encoding.UTF8, "application/json");
    var response = await client.PostAsync(uri, stringContent);
    if (response.IsSuccessStatusCode)
    {
      var content = response.Content.ReadAsStringAsync().Result;
      return JsonConvert.DeserializeObject<DataTable>(content);
    }
}
catch (Exception exception) when (exception is System.Net.WebException ||
                                  exception is HttpRequestException ||
                                  exception is SocketException)
{
    if (exception.InnerException is System.Net.WebException)
    {
      System.Net.WebException e = exception.InnerException as System.Net.WebException;
      Console.WriteLine(e.Status);
      throw e;
    }
}
catch (Exception ex)
{
    Debug.WriteLine(@"              ERROR {0}", ex.Message);
}

我得到的异常如下:

找不到类型“System.ComponentModel.ComponentConverter”的构造函数。

它到达了这一行:

return JsonConvert.DeserializeObject(content);

请记住,上面的代码在模拟器上运行良好。 任何帮助将不胜感激。

谢谢

编辑: 返回值用于我的代码的以下部分:

Task<DataTable> myTaskDataTable = Querymanager.ExecuteQuery();
DataTable myDataTable = await myTaskDataTable;
if (myDataTable != null)
{
  vListBL = new ObservableCollection<MyItem>();
  foreach (DataRow row in myDataTable.Rows)
  {
    MyItem vItem = new MyItem();
    vItem.value1 = row.ItemArray[0].ToString();
    vItem.value2 = row.ItemArray[2].ToString();
    vListBL.Add(vItem);
  }
}

content 变量包含一个表单数组

[{"COLUMN_NAME1":"value1","COLUMN_NAME2":"value2",...},{...},{...}]

这是我正在查询的数据库表的内容。数组中的每个元素代表一行。在数组的每个元素中,我都有 columnX 冒号 valueY 用逗号分隔。

【问题讨论】:

  • 能否添加DataTable类的定义?
  • 似乎链接的json字符串值与DataTable类不匹配,请附上content值和模型类DataTable
  • DataTable 类是从 Microsoft .NET Framework 中找到的here 并且内容被调用函数使用,如帖子的编辑版本所示

标签: c# ios xamarin.forms


【解决方案1】:

由于Limitations,iPhone 的内核阻止应用程序动态生成代码 iPhone 上的 Mono 不支持任何形式的动态代码生成。

我们必须手动创建模型类,并使用它来反序列化,我推荐你使用json2csharp

JsonConvert.DeserializeObject<List<RootObject>>(content);

public class RootObject
{
    public string COLUMN_NAME1 { get; set; }
    public string COLUMN_NAME2 { get; set; }
    ....
}

【讨论】:

    猜你喜欢
    • 2018-10-14
    • 1970-01-01
    • 2013-05-24
    • 2011-05-30
    • 1970-01-01
    • 2011-02-25
    • 2012-01-24
    相关资源
    最近更新 更多