当Web服务调用解析JSON对象时,.net中究竟发生了什么?

时间:2011-07-12 03:16:23

标签: javascript .net ajax webmethod

假设我编写以下C#代码来定义Web方法:

public class Thing
{
    public string X {get;set}
    public string Y {get;set}
}

[WebMethod]
public static void myFunction(Thing thing) { }

我发现我可以使用看起来像这样的jQuery JavaScript调用该函数:

var myData = { X: "hello", Y: "world" };
var jsonData = JSON.stringify(myData);
jQuery.ajax({ data: jsonData, ...

当调用myFunction时,thing.X设置为“hello”,thing.Y设置为“world”。 .net框架究竟做了什么来设置thing的值?它是否会调用构造函数?

1 个答案:

答案 0 :(得分:2)

就像你可以像这样创造事情

Thing x = new Thing { X = "hello", Y = "world" }

所以不,它不会调用构造函数来回答你的问题。

好的,更详细......

它需要JSON并反序列化它。它从您的JSON对象填充属性。例如,如果您在JSON中有以下内容:

{"notRelated":0, "test": "string"}

序列化程序找不到X或Y的东西,并将它们设置为该数据类型的默认值。

让我们说你想要更深入。您可以自定义序列化和反序列化对象:

[Serializable]
public class MyObject : ISerializable 
{
  public int n1;
  public int n2;
  public String str;

  public MyObject()
  {
  }

  protected MyObject(SerializationInfo info, StreamingContext context)
  {
    n1 = info.GetInt32("i");
    n2 = info.GetInt32("j");
    str = info.GetString("k");
  }
[SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)]
  public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
  {
    info.AddValue("i", n1);
    info.AddValue("j", n2);
    info.AddValue("k", str);
  }
}

所以你可以看到,在你的情况下,XY正在捕捉参数。