如何在 C# 通用处理程序中引用从 javascript 接收的反序列化对象属性?

How to reference deserialized object properties received from javascript in C# generic handler?

我有一个 JavaScript 脚本,它进行 jQuery AJAX 调用,并在 "data" 属性:

data: { Specific: JSON.stringify({DAY: "1", DEP: "2", CARRIER: "3", FLT: "4", LEGCD: "5"})

因此在 C# 通用处理程序中接收:

var Specific = JsonConvert.DeserializeObject(context.Request.Params["Specific"]);

在通用处理程序中,在 Visual Studio 调试器中,我可以看到接收到的对象。

Specific = {{ "DAY": "", "DEP": "", "CARRIER": "", "FLT": "", "LEGCD": "" }}

我的问题是,如何引用接收到的对象的属性(DAY、DEP、FLT 等)?

我尝试了 Specific.DAYSpecific["DAY"],但没有成功。

而不是使用

var Specific = JsonConvert.DeserializeObject(context.Request.Params["SpecificFlt"]);

并以 "Specific" 的 System.Object 类型结束,反序列化为自定义类型可能会有所帮助,如下所示:

public class SpecificObj
{
    public string DAY {get; set;}
    public string DEP {get; set;}
    public string CARRIER {get; set;}
    public string FLT {get; set;}
    public string LEGCD {get; set;}
}

var Specific = JsonConvert.DeserializeObject<SpecificObj>(context.Request.Params["SpecificFlt"]);

从那里您应该能够使用典型的点操作访问属性 (Specific.DAY)

编辑:或者你可以使用反射:

Type t = Specific.GetType();
PropertyInfo p = t.GetProperty("DAY");
string day = (string)p.GetValue(Specific);

可以使用较新版本的 C# 以其他方式完成此反射,详见此处的一个答案:

How to access property of anonymous type in C#?

如果您不想创建 class,以下方法也可以

var specific = JObject.Parse(json);
// specific["DAY"] alone will return a JToken (JValue in this case),
// so use the explicit conversion to string
var day = (string)specific["DAY"];

或者,如果所有值都是字符串

var specific = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
var day = specific["DAY"]

如果 DAY 不在 JSON 中,第一个将 return null,第二个将抛出 KeyNotFoundException.