2 回答
TA贡献1859条经验 获得超6个赞
1)您需要创建一个枚举,其中包含owner_type在 json中具有价值的所有可能成员
[JsonConverter(typeof(StringEnumConverter))]
public enum EnumOwnerType
{
[EnumMember(Value = "App\\Models\\User")]
User,
[EnumMember(Value = "App\\Models\\Group")]
Group
}
您需要添加对项目的引用以进行组装System.Runtime.Serialization
,并且在您的程序中您必须导入一些名称空间,例如
using System.Runtime.Serialization;
对于EnumMemberAttribute。using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
对于StringEnumConverter。using Newtonsoft.Json.Linq;
对于JObject。
2)修改你的Vehicle
类如下
public class Vehicle
{
[JsonProperty("owner_type")]
public EnumOwnerType OwnerType { get; set; }
[JsonProperty("owner")]
public JObject Owner { get; set; }
}
在以上类别中的属性
OwnerType是类型EnumOwnerType。
Owner是类型JObject。
3)这是您的示例模型User
class User
{
public int id { get; set; }
public string username { get; set; }
public string email { get; set; }
public string email_verified_at { get; set; }
public DateTime? created_at { get; set; }
public DateTime? updated_at { get; set; }
}
这是为了Group
class Group
{
public int id { get; set; }
public string name { get; set; }
public DateTime? created_at { get; set; }
public DateTime? updated_at { get; set; }
public _Color color { get; set; }
}
class _Color
{
public int id { get; set; }
public string hex { get; set; }
public DateTime? created_at { get; set; }
public DateTime? updated_at { get; set; }
}
用法:反序列化代码
string json = "Your json here";
Vehicle vehicle = JsonConvert.DeserializeObject<Vehicle>(json);
switch (vehicle.OwnerType)
{
case EnumOwnerType.User:
User user = vehicle.Owner.ToObject<User>();
break;
case EnumOwnerType.Group:
Group group = vehicle.Owner.ToObject<Group>();
break;
}
在上面switch的块中,案例根据OwnerType枚举自动执行,并且Owner是JObject将您的ownerjson 对象类型转换为适当的模型User或Group。
输出:(来自调试器)
1) 对于你的第一个带有"owner_type": "App\\Models\\User".
2) 对于你的第二个 json"owner_type": "App\\Models\\Group"
TA贡献1877条经验 获得超1个赞
只是反序列化为动态。您可以使用 ExpandoObject 获得所需内容。
var converter = new ExpandoObjectConverter();
dynamic customer1 = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
Console.WriteLine(customer1.owner.username);
- 2 回答
- 0 关注
- 95 浏览
添加回答
举报