将JSON反序列化为通用类型,其中集合属性名称根据类型而变化

db2

我正在使用Newtonsoft.Json解析一些API响应,并且它们似乎具有非常规则的结构,只是数组属性名称会根据返回类型而变化。几个响应示例(带有虚假/空数据):

顾客:

{
  "success": true,
  "message": "Records Retrieved Successfully",
  "data": {
    "total_count": "1",
    "customer": [
      {
        "id": "1234",
        "accountId": "220",
        "email": "[email protected]",
        "name": "JSON Voorhees",
        "company": "Test Company",
        "customFieldsValues": [
          {
            "value": "Some Guy",
            "field": {
              "id": "69",
              "name": "SalespersonID",
              "label": "Account Manager"
            }
          }
        ]
      }
    ]
  }
}

发票:

{
  "success": true,
  "message": "Records Retrieved Successfully",
  "data": {
    "total_count": "0",
    "invoice": []
  }
}

您会在第一个中注意到,数组的属性名称是“ customer”,在第二个中,它是“发票”(我们没有任何发票,所以我不知道它的确切结构是什么)对象仍将是)。

我的最终目标是反序列化为这样的类结构:

public class Response {
    [JsonProperty("success")]
    public bool Success { get; set; }
    [JsonProperty("message")]
    public string Message { get; set; }
}

public class Response<T> : Response {
    public List<T> Data { get; set; }
}

由于这不能通过简单的DeserializeObject()调用直接完成(因为业务对象的数组包含在该中间的“ data”属性中),这似乎离所需的对象有点近,但是问题在于该[JsonProperty()]属性的移动目标

public class Response {
    [JsonProperty("success")]
    public bool Success { get; set; }
    [JsonProperty("message")]
    public string Message { get; set; }
}

public class Response<T> : Response {
    public ResponseData Data { get; set; }
}

public class ResponseData<T> {
    [JsonProperty("total_count")]
    public int TotalCount { get; set; }

    [JsonProperty("???")] //Moving target
    public List<T> Data { get; set; }
}

实现这一目标的最明智的方法是什么?

db2

好的,这是可行的,但这当然不是我见过的最漂亮的东西(对转换为字典的中间步骤并不完全满意)。如果有人知道这样做的更好方法,请暂时保留此问题。

各种对象:

public class Response {
    [JsonProperty("success")]
    public bool Success { get; set; }
    [JsonProperty("message")]
    public string Message { get; set; }
}

public class Response<T> : Response {
    [JsonProperty("data")]
    [JsonConverter(typeof(DataConverter))]
    public List<T> Data { get; set; }
}

public class DataConverter : JsonConverter {
    public override bool CanConvert(Type objectType) {
        return typeof(List<object>).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
        Dictionary<string, object> data = (Dictionary<string, object>)serializer.Deserialize(reader, typeof(Dictionary<string, object>));
        foreach (KeyValuePair<string, object> kvp in data) {
            if (kvp.Key != "total_count") {
                return ((JToken)kvp.Value).ToObject(objectType);
            }
        }

        return null;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
        throw new NotImplementedException();
    }
}

然后获取响应:

public Response<Customer> GetCustomers() {
    string response = SendRequest("/api/v1/customers");
    Response<Customer> aresponse = JsonConvert.DeserializeObject<Response<Customer>>(response);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将JSON反序列化为通用类型,其中集合属性名称根据类型而变化

来自分类Dev

如何将JSON包装的集合属性反序列化为通用类?

来自分类Dev

将JSON反序列化为通用接口属性

来自分类Dev

将json字符串反序列化为通用类型的列表

来自分类Dev

Typescript将json反序列化为具有多种类型的集合

来自分类Dev

将JSON反序列化为类型化类

来自分类Dev

无法将JSON反序列化为强类型对象

来自分类Dev

将TimeSpan值序列化和反序列化为Object类型的属性

来自分类Dev

使用PHP中的类型将嵌套对象序列化/反序列化为JSON

来自分类Dev

反序列化为JObject时获取类型名称

来自分类Dev

将类类型序列化为JSON?

来自分类Dev

将类类型序列化为JSON?

来自分类Dev

当集合是另一种类型的属性时,Protobuf-net将空集合反序列化为null

来自分类Dev

当集合是另一种类型的属性时,Protobuf-net将空集合反序列化为null

来自分类Dev

使用json.net和包含@符号的json属性反序列化为F#类型

来自分类Dev

JSON .NET使用对象键/名称反序列化为复杂类型

来自分类Dev

将一属性对象的JSON数组反序列化为字符串集合

来自分类Dev

将String值设置为该属性类型/ XML反序列化为class。C#

来自分类Dev

将xml反序列化为其他类型

来自分类Dev

JSON.Net-类类型为序列化为类型名称而不是值的属性

来自分类Dev

如何使用 NewtonSoft Json 反序列化为具有可变类型属性的类?

来自分类Dev

将Json反序列化为T类型的对象将返回0

来自分类Dev

JSON反序列化为C#类型

来自分类Dev

JSON 异常反序列化为正确的类型

来自分类Dev

将JSON搜索结果反序列化为强类型列表(JSON.NET)

来自分类Dev

直接将Json.net JSON文件反序列化为C#字典类型?

来自分类Dev

通过属性名称以及JsonProperty将JSON反序列化为对象

来自分类Dev

将JSON中的嵌套对象反序列化为特定类型

来自分类Dev

C#将JSON反序列化为任何类型方法

Related 相关文章

  1. 1

    将JSON反序列化为通用类型,其中集合属性名称根据类型而变化

  2. 2

    如何将JSON包装的集合属性反序列化为通用类?

  3. 3

    将JSON反序列化为通用接口属性

  4. 4

    将json字符串反序列化为通用类型的列表

  5. 5

    Typescript将json反序列化为具有多种类型的集合

  6. 6

    将JSON反序列化为类型化类

  7. 7

    无法将JSON反序列化为强类型对象

  8. 8

    将TimeSpan值序列化和反序列化为Object类型的属性

  9. 9

    使用PHP中的类型将嵌套对象序列化/反序列化为JSON

  10. 10

    反序列化为JObject时获取类型名称

  11. 11

    将类类型序列化为JSON?

  12. 12

    将类类型序列化为JSON?

  13. 13

    当集合是另一种类型的属性时,Protobuf-net将空集合反序列化为null

  14. 14

    当集合是另一种类型的属性时,Protobuf-net将空集合反序列化为null

  15. 15

    使用json.net和包含@符号的json属性反序列化为F#类型

  16. 16

    JSON .NET使用对象键/名称反序列化为复杂类型

  17. 17

    将一属性对象的JSON数组反序列化为字符串集合

  18. 18

    将String值设置为该属性类型/ XML反序列化为class。C#

  19. 19

    将xml反序列化为其他类型

  20. 20

    JSON.Net-类类型为序列化为类型名称而不是值的属性

  21. 21

    如何使用 NewtonSoft Json 反序列化为具有可变类型属性的类?

  22. 22

    将Json反序列化为T类型的对象将返回0

  23. 23

    JSON反序列化为C#类型

  24. 24

    JSON 异常反序列化为正确的类型

  25. 25

    将JSON搜索结果反序列化为强类型列表(JSON.NET)

  26. 26

    直接将Json.net JSON文件反序列化为C#字典类型?

  27. 27

    通过属性名称以及JsonProperty将JSON反序列化为对象

  28. 28

    将JSON中的嵌套对象反序列化为特定类型

  29. 29

    C#将JSON反序列化为任何类型方法

热门标签

归档