Xamarin.Forms将json反序列化为一个对象

时间:2014-10-26 12:53:29

标签: ios xamarin.forms json-deserialization

var myObjectList = (List<MyObject>)JsonConvert.DeserializeObject(strResponseMessage, typeof(List<MyObject>));

当JSON具有以下格式时,上面的工作是将JSON字符串反序列化为自定义对象列表

[
   {
     "Name": "Value"
   },
   {
     "Name": "Value"
   },
   {
     "Name": "Value"
   },
   "Name": "Value"
   }
]

当格​​式如下时,我不知道如何做同样的事情

{
    "ReturnedData" : [
       {
         "Name": "Value"
       },
       {
         "Name": "Value"
       },
       {
         "Name": "Value"
       },
       "Name": "Value"
       }
    ]

}

我可以获得这样的数据

JObject information = JObject.Parse(strResponseMessage);
foreach (dynamic data in information)
{
   //convert to object here
}

并且适用于Android,但似乎您无法使用某种类型的“动态”iOS,因为我收到错误:

Object type Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder cannot be converted to target type: System.Object[]

我错过了将第二个JSON字符串转换为第一个字符串的步骤吗?

3 个答案:

答案 0 :(得分:2)

如果JsonConvert是JSON.Net而不是List使用

public class MyClass {
    public List<MyObject> ReturnedData { get; set; }
}

答案 1 :(得分:1)

感谢您的回复 - 我能够按照以下方式解决问题

JObject information = JObject.Parse(strResponseMessage);

string json = JsonConvert.SerializeObject(strResponseMessage["ReturnedData "]);

var myObjectList = (List<MyObject>)JsonConvert.DeserializeObject(json , typeof(List<MyObject>));

完美无缺!

答案 2 :(得分:0)

您无法在 iOS 上使用动态关键字作为禁止生成代码,因为它在此link中说明。

引用: -

  

无动态代码生成

     

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

     

这些包括:

     

System.Reflection.Emit不可用。

引用: -

  

System.Reflection.Emit

     

缺少System.Reflection。发射意味着不依赖于运行时代码生成的代码将起作用。这包括:

     

动态语言运行时。

     

在动态语言运行时之上构建的任何语言。

显然从v7.2中可以看到一些支持,如link所示 - 请参阅@Rodja的回答。 - 然而 - 非常实验性且缺陷阻止其完全正常工作。

您最好的方法是处理 JObject - ,不用 - 依赖动态关键字,您就可以在 > Android iOS