C# 从JSON(脚本对象)反序列化到托管对象

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

我正试图通过Silverlight反序列化javascript返回的json

基本上,在客户端,我返回JSON,在我的C#处理程序中,我通过ScriptObject获取JSON

我在ScriptObject上尝试了ConvertTo方法,但仍然无法获得任何结果

我如何才能将ScriptObject转换为一个C#对象(即对象列表)

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;
  }
}