使用MonoTouch进行JSON反序列化

rih*_*iha 7 c# serialization json xamarin.ios

Web上有各种各样的资源,解释了如何将一些C#对象序列化为JSON字符串.我无法让任何人使用MonoTouch 3.2.4.

我遇到的替代品:

  • System.Json命名空间
    我已经成功使用System.Json命名空间来反序列化数据.因此,为了简单起见,我宁愿坚持这一点,如果可能的话.不幸的是,我不知道如何用它序列化(或者甚至可能).

  • System.Runtime.Serialization.Json.DataContractJsonSerializer
    MonoTouch中没有System.Runtime.Serialization.Json命名空间.我在某处读到它是.NET 3.5的一部分,而且MonoTouch处于.NET 2.0级别.这可能解释了它.

  • System.Web.Script.Serialization.JavaScriptSerializer
    在MonoTouch中也缺少这个(事实上,似乎只有System.Web.Services可用).

  • James Newton-King的Json.NET
    我通过包含.NET 2.0程序集dll和使用Newtonsoft.Json.JsonConvert.SerializeObject()设法使这个工作在模拟器上工作.但是,这不会为设备编译,错误" mtouch失败,没有输出 ".一旦我删除了程序集引用,它就会很好地编译.

有没有办法让其中一个使用MonoTouch?还有其他尝试吗?

谢谢

jon*_*ers 7

我建议使用System.Json库,它不是很难使用,并且在类中包装以使其强类型化.它也作为MonoTouch的默认程序集包含在内,因为它继承自Silverlight.

加载它:

JsonValue value = JsonObject.Load(stream); //There are other overloads here, my stream is off an HttpWebRequest
Run Code Online (Sandbox Code Playgroud)

这是一个索引的例子:

this.StringValue = value[0];
this.IntValue = value[1];
Run Code Online (Sandbox Code Playgroud)

一个我的名字:

this.StringValue = value["StringValue"];
this.IntValue = value["IntValue"];
Run Code Online (Sandbox Code Playgroud)

是命名的StringValue字符串属性并命名INTVALUE一个int属性的类.在大多数情况下,JsonValue类将隐式转换为您的类型.

所以我所做的是创建一个类以强类型方式保存所有Json信息,然后在构造函数中传入JsonValue来执行丑陋的弱类型化的东西.

对于其他库,您将遇到问题,其中MonoTouch剥离了在通过反射创建时被视为"未使用"的类型(例如,当您使用XmlSerializer时).我发现自己在不必要的情况下解决这个问题,不得不在类型上添加PreserveAttribute等.

有关此问题,请阅读此处以获取有关Preserve:MonoTouch Doc的更多信息