【发布时间】:2013-11-20 05:05:25
【问题描述】:
我一直在使用 DataContractJsonSerializer 将从 HubSpot API 返回的数据转换为强类型对象,但我在使用用户配置文件对象时遇到了一些问题。
在此示例中,我能够获取 Id 和 IsContact 属性,但无法弄清楚如何获取属性列表,因为我事先不知道它们是什么。我想让 Properties 成为 Dictionary 但我不知道该怎么做。我不关心每个属性的版本,只关心值。
这是 API 返回的数据的简化示例:
{
"vid": 72361,
"is-contact": true,
"properties": {
"city": {
"value": "Burlington",
"versions": [
{
"value": "Burlington",
"source-type": "SALESFORCE",
"source-id": "continuous",
"source-label": null,
"timestamp": 1384319976006,
"selected": false
}
]
},
"country": {
"value": "US",
"versions": [
{
"value": "US",
"source-type": "SALESFORCE",
"source-id": "continuous",
"source-label": null,
"timestamp": 1384319976006,
"selected": false
}
]
},
"company": {
"value": "Bridgeline Digital",
"versions": [
{
"value": "Bridgeline Digital",
"source-type": "SALESFORCE",
"source-id": "continuous",
"source-label": null,
"timestamp": 1384319976006,
"selected": false
}
]
}
}
}
这是我试图反序列化的对象:
[DataContract]
public class HubSpotUserProfile
{
[DataMember(Name = "vid")]
public int Id { get; set; }
[DataMember(Name = "is-contact")]
public bool IsContact { get; set; }
[DataMember(Name = "redirect")]
public string RedirectUrl { get; set; }
[DataMember(Name = "properties")]
public Dictionary<string, HubSpotUserProfileProperty> Properties { get; set; }
}
[DataContract]
public class HubSpotUserProfileProperty
{
[DataMember(Name = "value")]
public string Value { get; set; }
}
我调用这个方法来执行反序列化:
public static T Post<T>(string url, string postData) where T : class
{
string json = Post(url, postData);
if (!String.IsNullOrWhiteSpace(json))
{
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
return (T)serializer.ReadObject(stream);
}
}
return null;
}
当我这样做时,不会引发错误,但属性的计数始终为 0。关于如何实现此目标的任何想法?
【问题讨论】:
-
你会如何处理额外的属性?由于您不知道它们是什么,因此可能很难编写代码来使用它们。
标签: c# asp.net json serialization