决定自定义 Class 动态解析 Json
Decide Custom Class Dynamically to parse Json
我需要将 Json 解析为 class,许多属性保持不变,但有一个对象是基于已传递的 JSON 类型的动态对象,比如如果是Customer.json,我需要解析CustomerAttributes连同BaseResponse,如果是Order.json,我需要OrderAttributes连同BaseResponse。我事先知道Json是什么类型。
这是我的代码。
public abstract class BaseResponse
{
public int Id {get;set;}
public int Name {get;set;}
public CommonResponse metadata { get; set; }
}
public class CommonResponse
{
public string apiVersion { get; set; }
public Pagination pagination { get; set; }
// I need CustomerAttributes here if I am parsing Customer.Json and
// OrderAttributes here if I am parsing Order.Json
}
public class Pagination
{
public int totalPages { get; set; }
public int number { get; set; }
public int size { get; set; }
}
public class CustomerAttributes
{
public int Age { get; set;}
public string Address { get; set;}
}
public class OrderAttributes
{
public int Amount { get; set;}
public DateTime startDate { get; set;}
public DateTime endDate { get; set;}
}
我无法弄清楚我的 CommonResponse class 中应该包含什么来解析这两个属性。
有多种方法可以处理这种情况。以下是我发现自己最常使用的。
如果调用解析器的代码可以知道它需要哪种类型,您可以使 属性 通用:
public class CommonResponse<TAttributes>
{
public string apiVersion { get; set; }
public Pagination pagination { get; set; }
public TAttributes attributes { get; set; }
}
另一方面,如果您直到稍后才知道它可能是哪种类型,您可以只使用 JObject(或您正在使用的 JSON 解析库的等效类型),并且在您知道期望的类型时反序列化它:
public class CommonResponse
{
public string apiVersion { get; set; }
public Pagination pagination { get; set; }
public JObject attributes { get; set; }
}
我需要将 Json 解析为 class,许多属性保持不变,但有一个对象是基于已传递的 JSON 类型的动态对象,比如如果是Customer.json,我需要解析CustomerAttributes连同BaseResponse,如果是Order.json,我需要OrderAttributes连同BaseResponse。我事先知道Json是什么类型。
这是我的代码。
public abstract class BaseResponse
{
public int Id {get;set;}
public int Name {get;set;}
public CommonResponse metadata { get; set; }
}
public class CommonResponse
{
public string apiVersion { get; set; }
public Pagination pagination { get; set; }
// I need CustomerAttributes here if I am parsing Customer.Json and
// OrderAttributes here if I am parsing Order.Json
}
public class Pagination
{
public int totalPages { get; set; }
public int number { get; set; }
public int size { get; set; }
}
public class CustomerAttributes
{
public int Age { get; set;}
public string Address { get; set;}
}
public class OrderAttributes
{
public int Amount { get; set;}
public DateTime startDate { get; set;}
public DateTime endDate { get; set;}
}
我无法弄清楚我的 CommonResponse class 中应该包含什么来解析这两个属性。
有多种方法可以处理这种情况。以下是我发现自己最常使用的。
如果调用解析器的代码可以知道它需要哪种类型,您可以使 属性 通用:
public class CommonResponse<TAttributes>
{
public string apiVersion { get; set; }
public Pagination pagination { get; set; }
public TAttributes attributes { get; set; }
}
另一方面,如果您直到稍后才知道它可能是哪种类型,您可以只使用 JObject(或您正在使用的 JSON 解析库的等效类型),并且在您知道期望的类型时反序列化它:
public class CommonResponse
{
public string apiVersion { get; set; }
public Pagination pagination { get; set; }
public JObject attributes { get; set; }
}