大家好日子,
我使用的是降级版的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冒号值。
答案 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; }
....
}