提问者:小点点

反序列化嵌套json对象。 当内部对象可能不同时


我处理的服务返回嵌套到泛型对象中的不同对象。 以下是来自服务的示例模型结果

{"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");
        }

但返回的对象不包含数据。 我将感激任何关于建模这个算法的帮助。 提前谢谢你。


共2个答案

匿名用户

当您在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; }
    }

工作演示

输出样本