如何在 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.DAY
和 Specific["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
.
我有一个 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.DAY
和 Specific["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
.