确定对象“;类型“;json反序列化期间

本文关键字:反序列化 json 类型 对象 | 更新日期: 2023-09-27 17:58:11

在尝试将一个复杂的JSON对象(JIRA问题)反序列化为一个包含字符串字段类型字典的对象时,我遇到了一点麻烦。

虽然我可以反序列化各种预先确定的对象类型(标准),但我在自定义字段方面遇到了一些困难,这些字段可能是各种类型的(它们都以customfield_开头,后面跟着一组数字)。

自定义字段可以是浮点、字符串、布尔值、对象和对象数组。后一种情况给我带来了问题,因为在对对象进行反序列化之前,我似乎无法确定它是什么

我已经寻找了一种方法,也许可以在反序列化之前"窥探"对象中的数据,因为其中一个字段包含特定于其类型的信息。这样我就可以确定对象的类型,并告诉Json.Net将其反序列化为.

我考虑过在序列化之前解析JSON字符串以获取信息,或者可能只是在遇到这种特殊情况时,但也许有更好的方法?

提前感谢您对此的任何建议。

确定对象“;类型“;json反序列化期间

您可以使用Json.Net反序列化为对象

using System;
using Newtonsoft.Json;
namespace Sandbox
{
class Program
{
    private static void Main(string[] args)
    {
       var nestDto = new Dto
        {
            customfield_1 = 20,
            customfield_2 = "Test2"
        };
        var dto = new Dto
        {
            customfield_1 = 10,
            customfield_3 = new[] { nestDto },
            customfield_2 = "Test"
        };
        var jsonString = JsonConvert.SerializeObject(dto);
        Console.WriteLine(jsonString);
        var fromJsonString = JsonConvert.DeserializeObject<Dto>(jsonString);
        Console.WriteLine(fromJsonString.customfield_3[0].customfield_2); //Outputs Test2
        Console.ReadKey();
    }
}
class Dto
{
    public int customfield_1 { get; set; }
    public string customfield_2 { get; set; }
    public Dto[] customfield_3 { get; set; }
}
}

您可以反序列化为与JSON.net显式用于ExtensionData的类型相同的类型,而不是峰值。例如:

if (reader.TokenType == JsonToken.StartArray)
{
    var values = serializer.Deserialize<List<Dictionary<string, JToken>>>(reader);
    objectContainer = ClassifyAndReturn(values); 
}
private ObjectType ClassifyAndReturn(List<Dictionary<string, JToken>> values)
{
    if (values.First().ContainsKey("self"))
    {
        string self = values.First()["self"].Value<string>();
        if (self.Contains("customFieldOption"))
        //... Then go into a series of if else cases to determine the object. 

对象的表示被作为字符串字典提供给JToken,然后可以很容易地手动检查和分配,或者在某些情况下自动反序列化(在其中一个字段是另一个对象的情况下)。

以下是对象构造函数的样子:

internal myobject(Dictionary<string, JToken> source)
{
    Self = source["self"].Value<string>();
    Id = source["id"].Value<string>();
    Value = source["value"].Value<string>();
}