JsonConvert.DeserializeObject <datatable>引发异常

时间:2018-04-19 19:41:25

标签: c# ios xamarin.forms

大家好日子,

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

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

我已经找到了解决这个问题的方法而没有运气。我见过多个类似的帖子,但没有一个解决方案适合我。我认为这是Xamarin关于iOS的限制,如here所述。但我想知道是否有办法解决它。这是我的代码导致引发异常:

在ExecuteQuery函数中,我有这段代码

public async Task 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'的构造函数。

它到达这条线:

  

返回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);
  }
}

内容 变量包含表单数组

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

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

1 个答案:

答案 0 :(得分:0)

由于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; }
    ....
}