C# 将JSON转换为基于其他属性的对象
我正在编写一些模型,并为它们分配C# 将JSON转换为基于其他属性的对象,c#,json.net,C#,Json.net,我正在编写一些模型,并为它们分配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
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
}
}
}
我正在尝试将所有者
映射到我的C#项目中相应的模型类。主要车型为车辆
:
使用Newtonsoft.Json;
名称空间OmegaAPI.Models
{
公车
{
[JsonProperty(“所有者类型”)]
私有字符串所有者类型{get;set;}
[JsonProperty(“所有者”)]
公共对象所有者{get;set;}
}
}
例如,我有
用户
和组
模型类,它们可以是车辆
的所有者。如何使用OwnerType
属性将owner
转换为适当的模型类?只需反序列化为动态。您可以通过使用ExpandoObject获得所需的内容
var converter = new ExpandoObjectConverter();
dynamic customer1 = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
Console.WriteLine(customer1.owner.username);
var converter=新的ExpandoObjectConverter();
动态customer1=JsonConvert.DeserializeObject(jsonString,converter);
Console.WriteLine(customer1.owner.username);
1)您需要创建一个枚举,其中包含所有可能的成员,这些成员在json中的值为所有者类型
[JsonConverter(typeof(StringEnumConverter))]
public enum EnumOwnerType
{
[EnumMember(Value = "App\\Models\\User")]
User,
[EnumMember(Value = "App\\Models\\Group")]
Group
}
您需要为assemblySystem.Runtime.Serialization
添加对项目的引用,并且在程序中必须导入一些名称空间,如
使用System.Runtime.Serialization代码>用于
使用Newtonsoft.Json代码>
使用Newtonsoft.Json.converter代码>用于
使用Newtonsoft.Json.Linq代码>用于
车辆
等级,如下所示
public class Vehicle
{
[JsonProperty("owner_type")]
public EnumOwnerType OwnerType { get; set; }
[JsonProperty("owner")]
public JObject Owner { get; set; }
}
在上层阶级中
属于OwnerType
类型EnumOwnerType
属于Owner
类型JObject
用户的示例模型
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; }
}
这是针对组的
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;
}
string json=“您的json在此”;
Vehicle Vehicle=JsonConvert.DeserializeObject(json);
开关(车辆所有者类型)
{
案例EnumOwnerType。用户:
User=vehicle.Owner.ToObject();
打破
案例EnumOwnerType.Group:
组=vehicle.Owner.ToObject();
打破
}
在上面的switch
块中,对于OwnerType
enum和Owner
自动执行的案例是一个JObject
将您的Owner
json对象类型转换为相应的模型User
或Group
输出:(来自调试器)
1) 对于第一个带有“owner\u type”的json:“App\\Models\\User”
2) 对于第二个带有“owner\u type”的json:“App\\Models\\Group”
您可以对OwnerType
使用enum
,然后在switch
语句中,您可以在每个案例中使用适当的模型。owner
的对象属性相对于OwnerType
是否发生了更改,或者它们对于每个OwnerType
是否都是固定的?owner
的属性发生了更改由于它需要转换为与所有者类型相关的不同模型,所以我的第一条评论是什么。这对你有帮助吗?@ersho你能提供代码示例吗?我不确定我是否理解正确