C# 从JSON(脚本对象)反序列化到托管对象
我正试图通过Silverlight反序列化javascript返回的json 基本上,在客户端,我返回JSON,在我的C#处理程序中,我通过ScriptObject获取JSON 我在ScriptObject上尝试了ConvertTo方法,但仍然无法获得任何结果 我如何才能将ScriptObject转换为一个C#对象(即对象列表)C# 从JSON(脚本对象)反序列化到托管对象,c#,silverlight,json,serialization,C#,Silverlight,Json,Serialization,我正试图通过Silverlight反序列化javascript返回的json 基本上,在客户端,我返回JSON,在我的C#处理程序中,我通过ScriptObject获取JSON 我在ScriptObject上尝试了ConvertTo方法,但仍然无法获得任何结果 我如何才能将ScriptObject转换为一个C#对象(即对象列表) SomeCallBack(ScriptObject result) { // convert to managed object var objec
SomeCallBack(ScriptObject result) {
// convert to managed object
var objects = result.ConvertTo<List<SomeObjectClass>>(); // can't get any property from it..
// however the count is correct...
MessageBox.Show("count: " + objects.Count); // shows correct count of items
}
SomeCallBack(脚本对象结果){
//转换为托管对象
var objects=result.ConvertTo();//无法从中获取任何属性。。
//然而,计数是正确的。。。
MessageBox.Show(“count:+objects.count);//显示项目的正确计数
}
Silverlight不包含获取ScriptObject
并序列化为JSON字符串的API
Silverlight通过System.ServiceModel.Web
dll中的System.Runtime.Serialization.JSON.DataContractJsonSerializer
类支持JSON序列化
您需要获取一些基于javascript的JSON序列化程序来转换您试图作为ScriptObject
传递的值,以便传递JSON字符串参数,而不是ScriptObject
。我相信这项工作最流行的工具是JQuery
现在,您似乎希望看到一个集合(类似于“[x1,x2,,,xn]”的JSON),其中x项的类型为SomeObjectClass
。您可以使用这个小的通用函数来反序列化这样的列表:-
List<T> DeserializeJSON<T>(string json)
{
byte[] array = Encoding.UTF8.GetBytes(json);
MemoryStream ms = new MemoryStream(array);
DataContractJsonSerializer dcs = new DataContractJsonSerializer(typeof(List<T>));
return (List<T>)dcs.ReadObject(ms);
}
List反序列化json(字符串json)
{
byte[]数组=Encoding.UTF8.GetBytes(json);
MemoryStream ms=新的MemoryStream(数组);
DataContractJsonSerializer dcs=新的DataContractJsonSerializer(类型(列表));
返回(列表)dcs.ReadObject(ms);
}
你会做:-
var objects = DeserializeJSON<SomeObjectClass>(someJSON);
var objects=DeserializeJSON(someJSON);
他们有一个silverlight版本,听起来像是Newtonsoft.Json.Linq.JObject。如果您返回一个实际的Json对象,那么您实际上可以使用ScriptObject.ConvertTo方法将Json对象直接反序列化为C#对象。例如,您可以执行以下操作: JSON对象
{ id: 0001,
name: 'some_name',
data: [0.0, 1.0, 0.9, 90.0] }
using System.Runtime.Serialization; // From the System.Runtime.Serialization assembly
[DataContract]
public struct JsonObj
{
[DataMember]
public int id;
[DataMember]
public string name;
[DataMember]
public double[] data;
}
C#Object
{ id: 0001,
name: 'some_name',
data: [0.0, 1.0, 0.9, 90.0] }
using System.Runtime.Serialization; // From the System.Runtime.Serialization assembly
[DataContract]
public struct JsonObj
{
[DataMember]
public int id;
[DataMember]
public string name;
[DataMember]
public double[] data;
}
C#回调
public void SomeCallback(ScriptObject rawJsonObj)
{
// Convert the object
JsonObj jsonObj = rawJsonObj.ConvertTo<JsonObj>();
}
public void SomeCallback(ScriptObject rawJsonObj)
{
//转换对象
JsonObj JsonObj=rawJsonObj.ConvertTo();
}
但是,如果您返回的字符串表示JSON对象,而不是实际的JSON对象,那么这将不起作用,您必须使用另一种反序列化方法。有关更多详细信息,请参阅
希望这能有所帮助。我通过
C
代码来模仿JS对象,就可以让它正常工作了。有趣的是,它甚至允许在JS端使用对象文本(请参见Collection
items,它们只是对象文本-动作不错-确实JS是驱动程序!)
SL代码(我将JS
对象传递到我的SL
组件中进行处理):
C#
公共类原型
{
公共列表集合
{
得到;
设置
}
}
公共类原型项
{
公共字符串a
{
得到;
设置
}
}
public class Prototype
{
public List<PrototypeItem> Collection
{
get;
set;
}
}
public class PrototypeItem
{
public string a
{
get;
set;
}
}