序列化并反序列化要建模的匿名子JSON属性
本文关键字:JSON 属性 反序列化 建模 序列化 | 更新日期: 2023-09-27 18:27:35
我有一个API正在从中接收数据。API的结构超出了我的控制范围,我需要序列化和反序列化JSON输出,以将数据映射到我的模型。
在JSON使用命名属性进行良好格式化的情况下,一切都很好。
在没有命名值,只有int和字符串数组的情况下,你能做什么?类似于位置
以下是JSON:的示例
{"id":"2160336","activation_date":"2013-08-01","expiration_date":"2013-08-29","title":"Practice Manager","locations":{"103":"Cambridge","107":"London"}}
我有这样的模型:
public class ItemResults
{
public int Id { get; set; }
public DateTime Activation_Date { get; set; }
public DateTime Expiration_Date{ get; set; }
public string Title { get; set; }
public Location Locations { get; set; }
}
public class Location
{
public int Id { get; set; }
public string value { get; set; }
}
我正在使用内置的ajax序列化进行映射:
protected T MapRawApiResponseTo<T>( string response )
{
if ( string.IsNullOrEmpty( response ) )
{
return default( T );
}
var serialize = new JavaScriptSerializer();
return serialize.Deserialize<T>( response );
}
var results = MapRawApiResponseTo<ItemResults>(rawApiResponse);
所以ID和所有其他属性都被提取并映射,但我每次做的事情似乎都无法映射位置。
非常感谢
public Dictionary<int,string> Locations { get; set; }
工作完成;你应该发现,至少使用Json.NET,即
var result = JsonConvert.DeserializeObject<ItemResults>(json);
在result.Locations
中得到2个条目;特别是result[103] = "Cambridge";
和result[107] = "London";
如果您不介意,可以使用dictionary解决问题:
class Program
{
static void Main(string[] args)
{
string json =
"{'id':'2160336','activation_date':'2013-08-01','expiration_date':'2013-08-29','title':'Practice Manager','locations':{'103':'Cambridge','107':'London'}}";
var deserializeObject = JsonConvert.DeserializeObject<ItemResults>(json);
Console.WriteLine("{0}:{1}", deserializeObject.Locations.First().Key, deserializeObject.Locations.First().Value);
Console.ReadKey();
}
}
public class ItemResults
{
public int Id { get; set; }
public DateTime Activation_Date { get; set; }
public DateTime Expiration_Date { get; set; }
public string Title { get; set; }
public Dictionary<int, string> Locations { get; set; }
}
您也可以使用手动解析,如以下所示:Json.NET(Newtonsoft.Json)-Two';属性';同名?
这将起作用:
public Dictionary<string, string> Locations { get; set; }
public IEnumerable<Location> LocationObjects { get { return Locations
.Select(x => new Location { Id = int.Parse(x.Key), value = x.Value }); } }
我向您建议以下解决方案:
public class ItemResults
{
public int Id { get; set; }
public DateTime Activation_Date { get; set; }
public DateTime Expiration_Date { get; set; }
public string Title { get; set; }
[JsonProperty("locations")]
public JObject JsonLocations { get; set; }
[JsonIgnore]
public List<Location> Locations { get; set; }
[OnDeserialized]
public void OnDeserializedMethod(StreamingContext context)
{
this.Locations = new List<Location>();
foreach (KeyValuePair<string, JToken> item in this.JsonLocations)
{
this.Locations.Add(new Location() { Id = int.Parse(item.Key), value = item.Value.ToString() });
}
}
}
public class Location
{
public int Id { get; set; }
public string value { get; set; }
}
在您只需要使用JsonConvert.DeserializeObject<ItemResults>(json);