使用MonoTouch进行JSON反序列化

7
在网络上有许多资源可以解释如何将一些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 failed with no output”。一旦我删除程序集引用,它就可以正常编译。
有没有办法让其中之一与MonoTouch一起工作?还有其他要尝试的选择吗?
谢谢
2个回答

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的整型属性的类。JsonValue类在大多数情况下都会隐式转换为您的类型。
因此,我会创建一个类以强类型方式容纳所有Json信息,然后在构造函数中传入JsonValue以执行丑陋的弱类型操作。
对于其他库,您将遇到MonoTouch删除反射创建的“未使用”类型的问题(例如,当您使用XmlSerializer时)。我发现自己不得不在类型上添加PreserveAttribute来解决这个问题,这使我更加费力了。
关于此问题,请阅读这里获取有关保留的更多信息: MonoTouch Doc

这看起来像是反序列化 - 将JSON字符串加载到JsonValue中,并从中检索字符串和整数。不过我正在寻找相反的操作 - 从我拥有的对象创建一个JSON字符串。如果我理解有误,请说明如何使用它来创建JSON字符串。 - riha
你可以反向操作,将value ["StringValue"]的值设为this.StringValue。JsonValue 中有一个Save()方法,可以将数据写入流中。创建初始对象时,由于构造函数是抽象的,所以没有简单的方法。也许可以尝试使用带有空字符串或包含默认值的 Json 字符串的 JsonObject.Parse 方法。 - jonathanpeppers
据我所知,JsonValue的ToString()方法也会生成JSON。 :) 好的,我将尝试创建一个空的JsonValue对象并为其赋值。 - riha
如果你正在写入流,最好使用Save()方法,因为它应该更快。这样就不会有中间字符串的创建。如果你正在联系一个Web服务器,这可能是你的情况,我会选择这种方式。 - jonathanpeppers

1

我没有信誉度,因此无法在上面的答案中发布评论。

只是想在使用System.Json.JsonObject.ToString()方法时发出警告。我正在使用它,它似乎可以很好地生成JSON..然后我有一个带有回车(\n)的字符串。它没有正确转义,最终生成了错误的JSON。

因此,如果您有简单的JSON,则可能会正常工作,但是如果您知道您的字符串中可能有需要转义的特殊字符,则应首先测试“ToString()”方法。

我认为newtonsoft JSON库看起来像是一种替代方案。 Xamarin网站上有关于此的信息:

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

我知道这不是一个好的回答,但只是想向系统json库的用户发布警告。


这里有一些街头信用。 - valdetero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接