我正在编写一些模型并为其分配JsonProperty
属性,以便可以使用Newtonsoft.Json
解析它们。我的问题是我的Laravel后端正在返回多态关系,因此这意味着我的属性可以是动态类型。
用户拥有:
{
"id": 1,
"owner_id": 1,
"owner_type": "App\\Models\\User",
"created_at": "2019-04-21 08:57:53",
"updated_at": "2019-04-21 08:57:53",
"owner": {
"id": 1,
"username": "testuser",
"email": "test123@mail.com",
"email_verified_at": null,
"created_at": "2019-04-20 10:23:50",
"updated_at": "2019-04-20 10:23:50"
}
}
由某个组拥有:
{
"id": 1,
"owner_id": 1,
"owner_type": "App\\Models\\Group",
"created_at": "2019-04-21 08:57:53",
"updated_at": "2019-04-21 08:57:53",
"owner": {
"id": 1,
"name": "Administration",
"created_at": "2019-04-01 00:00:00",
"updated_at": "2019-04-01 00:00:00",
"color": {
"id": 52,
"hex": "#426D42",
"created_at": null,
"updated_at": null
}
}
}
我正在尝试将owner
映射到C#项目中的适当模型类。主要模型是Vehicle
:
using Newtonsoft.Json;
namespace OmegaAPI.Models
{
public class Vehicle
{
[JsonProperty("owner_type")]
private string OwnerType { get; set; }
[JsonProperty("owner")]
public object Owner { get; set; }
}
}
例如,我有User
和Group
模型类,它们可以是Vehicle
的所有者。如何使用owner
属性将OwnerType
转换为适当的模型类?
答案 0 :(得分:1)
只需反序列化即可。您可以使用ExpandoObject获得所需的内容。
In [12]: L.sum(0) - L
Out[12]:
array([[18, 21, 24],
[15, 18, 21],
[12, 15, 18],
[ 9, 12, 15]])
答案 1 :(得分:1)
1),您需要创建一个枚举,该枚举包含json中owner_type
值的所有可能成员
[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;
for EnumMemberAttribute。using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
for StringEnumConverter。using Newtonsoft.Json.Linq;
for 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
的情况将类型将owner
json对象转换为User
或Group
的适当模型。
输出:(来自调试器)
1)对于带有"owner_type": "App\\Models\\User"
的第一个json。
2)对于带有"owner_type": "App\\Models\\Group"
的第二个json