【问题标题】:JSON de-serialization with MonoTouch使用 MonoTouch 进​​行 JSON 反序列化
【发布时间】:2011-02-15 12:56:05
【问题描述】:

网络上有各种资源解释如何将一些 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 可用)。

  • Json.NET by James Newton-King
    我设法通过包含 .NET 2.0 程序集 dll 并使用 Newtonsoft.Json.JsonConvert.SerializeObject() 使这个在模拟器上工作。但是,这不会为出现错误“mtouch failed with no output”的设备编译。一旦我删除程序集引用,它就可以正常编译。

有什么方法可以让其中一个与 MonoTouch 一起工作?是否有其他选择可以尝试?

谢谢

【问题讨论】:

    标签: c# json serialization xamarin.ios


    【解决方案1】:

    我建议使用 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"];
    

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

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

    对于其他库,您会遇到这样的问题:MonoTouch 会剔除在反射创建时被视为“未使用”的类型(例如,当您使用 XmlSerializer 时)。我发现自己在解决这个问题的必要性之外,不得不在类型上添加 PreserveAttribute 等。

    关于这个问题,请阅读此处了解有关 Preserve 的更多信息:MonoTouch Doc

    【讨论】:

    • 这看起来像反序列化 - 将 JSON 字符串加载到 JsonValue 中并从中检索字符串和整数。我正在寻找相反的东西 - 从我拥有的对象中创建一个 JSON 字符串。如果我弄错了,请说明如何使用它来创建 JSON 字符串。
    • 你反过来做,value["StringValue"] = this.StringValue。 JsonValue 上有一个 Save() 方法,它将写入流。对于初始对象的创建,我看不到一个简单的方法,因为构造函数是抽象的。也许尝试使用带有空字符串的 JsonObject.Parse 或带有默认值的 Json 字符串。
    • AFAIK,JsonValue 的 ToString() 也产生 JSON。 :) 好吧,我会尝试创建一个空的 JsonValue 对象并为其分配一些东西。
    • 如果您正在写入流,最好使用 Save() 方法,因为它应该更快。这样就不会创建中间字符串。如果您正在联系网络服务器,这可能是您的情况,我会走那条路。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

    • 这里有一些街头信誉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多