基于另一个属性将JSON转换为对象

时间:2019-04-21 09:12:02

标签: 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 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; }
    }
}

例如,我有UserGroup模型类,它们可以是Vehicle的所有者。如何使用owner属性将OwnerType转换为适当的模型类?

2 个答案:

答案 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添加对项目的引用,并且在程序中必须导入一些名称空间,例如

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枚举自动执行的情况和OwnerJObject的情况将类型将owner json对象转换为UserGroup的适当模型。

输出:(来自调试器)

1)对于带有"owner_type": "App\\Models\\User"的第一个json。

enter image description here

2)对于带有"owner_type": "App\\Models\\Group"的第二个json

enter image description here