【问题标题】:What exactly happens in .net when a webservice call parses a JSON object?当 web 服务调用解析 JSON 对象时,.net 中究竟发生了什么?
【发布时间】:2011-07-12 03:16:22
【问题描述】:

假设我编写以下 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 的值?它会调用构造函数吗?

【问题讨论】:

    标签: javascript .net ajax webmethod


    【解决方案1】:

    就像你可以创造这样的东西

    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

    【讨论】:

    • 那么...是否有特定的“序列化器”类被调用?
    • JavaScriptSerializer 像这样调用serializer.Deserialize<Thing>(jsonResponse);
    • 那么,在调用JavaScriptSerializer 之前必须发生一些事情,以便框架将响应识别为 JSON。
    • 请求中的标头:application/json
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多