Monotouch:将JSON从MVC反序列化为Montouch

时间:2011-12-09 19:31:33

标签: json model-view-controller xamarin.ios

在我的测试vb.net MVC网络应用程序中,我有这个json ....

Public Class Person
    Public Property Name As String
    Public Property Age As Byte
    Public Sub New(name As String, age As Byte)
        Me.Name = name
        Me.Age = age
    End Sub
End Class

Function GetPerson() As JsonResult
    Dim p As New Person("John Doe", 50)
    Return Json(p, JsonRequestBehavior.AllowGet)
End Function

在Monotouch,我有这个......

JsonObject j;
Uri address = new Uri("http://mysite/home/GetPerson");
HttpWebRequest httpReq = (HttpWebRequest)HttpWebRequest.Create (address);
using (HttpWebResponse httpRes = (HttpWebResponse)httpReq.GetResponse ()) {
    Stream s = httpRes.GetResponseStream ();
    j = (JsonObject)JsonObject.Load (s);
}

这节课......

Public Class Person {
    Public string Name { get; set; }
    Public byte Age { get; set; }
}

如何将JsonObject j解析为Person类? ..我希望像Person p =(Person)j.value;

这样的东西

谢谢! 魔

2 个答案:

答案 0 :(得分:5)

首先,我会使用int作为Age。但假设JSON结构如:

{   
    "Name" : "John Doe",
    "Age" : 100,
}

如果你想在System.Json中使用烘焙:

var person = new Person()
var obj = JsonObject.Parse(json);

person.Name = obj["Name"].ToString();
person.Age = (int)obj["Age"];

HIGHLY 建议使用ServiceStack.Text,它是一个高度优化的极快库,可以使用兼容MonoTouch和Mono for Android的JSON ...开箱即用!< / p>

您可以使用ServiceStack here查看使用JSON的API。

答案 1 :(得分:3)

即使这个问题现在已经过时了,这里也是我使用的解决方案。 使用MonoTouch,您可以使用基于DataContract的.net Json序列化机制。

[DataContract]
Public Class Person {
    [DataMember]
    Public string Name { get; set; }
    [DataMember]
    Public byte Age { get; set; }
}

并使用DataContractJsonSerializer(在System.Runtime.Serialization.Json中找到)

Stream stream = httpRes.GetResponseStream ();
DataContractJsonSerializer jsSerializer = new  DataContractJsonSerializer(typeof(Person));
Person person = (Person)jsSerializer.ReadObject(stream);

这样,代码符合WCF,并且在ms.net平台上工作完美,单声道和单触点。