Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将JSON转换为基于其他属性的对象_C#_Json.net - Fatal编程技术网

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
}
您需要为assembly
System.Runtime.Serialization
添加对项目的引用,并且在程序中必须导入一些名称空间,如

  • 使用System.Runtime.Serialization用于
  • 使用Newtonsoft.Json
  • 使用Newtonsoft.Json.converter用于
  • 使用Newtonsoft.Json.Linq用于
2)修改
车辆
等级,如下所示

public class Vehicle
{
    [JsonProperty("owner_type")]
    public EnumOwnerType OwnerType { get; set; }

    [JsonProperty("owner")]
    public JObject Owner { get; set; }
}
在上层阶级中

  • OwnerType
    属于
    EnumOwnerType
    类型
  • Owner
    属于
    JObject
    类型
3)这是
用户的示例模型

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你能提供代码示例吗?我不确定我是否理解正确