我处理的服务返回嵌套到泛型对象中的不同对象。 以下是来自服务的示例模型结果
{"date":1591430887.591481,"results":[{"identity":"result_type_a","result":{"attr_a":1591427634}}]}
{"date":1591430887.591481,"results":[{"identity":"result_type_b","result":{"attr_b":1591427634,"attr_bb":3591457634}}]}
{"date":1591430887.591481,"results":[{"identity":"result_type_c","result":{"attr_c":1591427634,"attr_cc":3591457634,"attr_cc":59634}},{"identity":"result_type_d","result":{"attr_d":"rfrvr","attr_dd":"ytur"}}]}
我尝试创建一个将result属性声明为string的泛型对象。 并计划我可以反序列化到返回的json到那个泛型对象,检查identity属性并将结果属性中的字符串反序列化到特定的对象类型。
下面是对象结构
public class GeneralResponse
{
[JsonProperty("date")]
public double Date { get; set; }
[JsonProperty("results")]
public List<GenericResults> Results { get; set; }
}
public class GenericResults
{
[JsonProperty("identity")]
public string Identity { get; set; }
[JsonProperty("result")]
public string Result { get; set; }
}
为了序列化/反序列化,我使用了Newtonsoft库,代码如下
public static GeneralResponse SerializeResponse(string response)
{
return JsonConvert.DeserializeObject<GeneralResponse>(response);
}
不幸的是,我在反序列化泛型对象时遇到了以下异常。
“分析值时遇到意外字符:{。Path”results[0].results“,第1行,位置71.”
如果我将GenericResult的Result属性声明为对象,如下所示
public class GenericResults
{
[JsonProperty("identity")]
public string Identity { get; set; }
[JsonProperty("result")]
public object Result { get; set; }
}
我可以通过第一次序列化,然后进行第二次序列化,而不会得到任何异常。
string inner_object = response.Result.ToString();
switch (type)
{
case ResponseTypes.type_A: return JsonConvert.DeserializeObject<ObjectTypeA>(inner_object);
case ResponseTypes.type_B: return JsonConvert.DeserializeObject<ObjectTypeB>(inner_object);
case ResponseTypes.type_C: return JsonConvert.DeserializeObject<ObjectTypeC>(inner_object);
default: throw new Exception("Unknown Response Type");
}
但返回的对象不包含数据。 我将感激任何关于建模这个算法的帮助。 提前谢谢你。
当您在JSON.NET序列化中使用string
时,它实际上并没有使用JSON字符串,而是尝试解析JSON字符串值。
您可以改用JObject
,它是JSON对象的JSON.NET包装器。 然后,可以使用JObject
反序列化为类型,或者直接访问JSON属性
您可以使用字典来存储结果,结果看起来是多态的。 例如,
public partial class GeneralResponse
{
[JsonProperty("date")]
public double Date { get; set; }
[JsonProperty("results")]
public ResultElement[] Results { get; set; }
}
public partial class ResultElement
{
[JsonProperty("identity")]
public string Identity { get; set; }
[JsonProperty("result")]
public Dictionary<string,object> Result { get; set; }
}
工作演示
输出样本