使用MonoTouch进行JSON反序列化

时间:2011-02-15 12:56:05

标签: c# json serialization xamarin.ios

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

我遇到的替代方案:

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

  • System.Runtime.Serialization.Json.DataContractJsonSerializer
    System.Runtime.Serialization.Json命名空间在MonoTouch中不可用。我在某处读到它是.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?还有其他选择吗?

由于

2 个答案:

答案 0 :(得分:7)

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

加载它:

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

以下是索引的示例:

this.StringValue = value[0];
this.IntValue = value[1];

一个我的名字:

this.StringValue = value["StringValue"];
this.IntValue = value["IntValue"];

其中是一个具有名为StringValue的字符串属性和名为IntValue的int属性的类。在大多数情况下,JsonValue类将隐式转换为您的类型。

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

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

关于此问题,请阅读此处以获取有关Preserve:MonoTouch Doc

的更多信息

答案 1 :(得分:1)

我没有街头信誉,所以我不能对上面的答案发表评论..

只是想在使用System.Json.JsonObject.ToString()方法时发布警告。我正在使用它,它似乎生成JSON很好..然后我有一个返回(\ n)的字符串。它没有正确地逃脱,它最终产生了糟糕的JSON ..

所以,如果你有简单的JSON,它可能工作正常,但如果你知道你的字符串中可能有特殊字符需要转义,你应该先测试“ToString()”方法。

我认为newtonsoft JSON库看起来像另一种选择。在Xamarin的网站上有关于此的信息:

https://components.xamarin.com/view/json.net

意识到这是一个糟糕的答案,但只想将警告发布给系统json lib的用户。