C# “确定对象”;“类型”;在json反序列化期间

C# “确定对象”;“类型”;在json反序列化期间,c#,json,json.net,deserialization,jira,C#,Json,Json.net,Deserialization,Jira,在尝试将复杂的JSON对象(JIRA问题)反序列化为包含字符串字段类型字典的对象时,我遇到了一些麻烦 虽然我可以反序列化各种预先确定的对象类型(标准),但使用自定义字段却有点困难,这些字段可以是各种类型(它们都以customfield\uuuu开头,后跟一组数字) 自定义字段可以是浮点、字符串、布尔、对象和对象数组。后者给我带来了问题,因为我似乎无法在反序列化之前确定对象是什么 我一直在寻找一种方法,或许可以在反序列化之前“窥视”对象中的数据,因为其中一个字段包含特定于其类型的信息。这样我就可以

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

虽然我可以反序列化各种预先确定的对象类型(标准),但使用自定义字段却有点困难,这些字段可以是各种类型(它们都以
customfield\uuuu
开头,后跟一组数字)

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

我一直在寻找一种方法,或许可以在反序列化之前“窥视”对象中的数据,因为其中一个字段包含特定于其类型的信息。这样我就可以确定对象的类型,并告诉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; }
}
}
使用系统;
使用Newtonsoft.Json;
名称空间沙盒
{
班级计划
{
私有静态void Main(字符串[]args)
{
var nestDto=新的Dto
{
自定义字段_1=20,
customfield_2=“Test2”
};
var dto=新dto
{
自定义字段_1=10,
customfield_3=new[]{nestDto},
customfield_2=“测试”
};
var jsonString=JsonConvert.SerializeObject(dto);
Console.WriteLine(jsonString);
var fromJsonString=JsonConvert.DeserializeObject(jsonString);
Console.WriteLine(fromJsonString.customfield_3[0].customfield_2);//输出Test2
Console.ReadKey();
}
}
类Dto
{
public int customfield_1{get;set;}
公共字符串customfield_2{get;set;}
公共数据到[]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. 
if(reader.TokenType==JsonToken.StartArray)
{
var values=序列化程序。反序列化(读取器);
objectContainer=ClassifyAndReturn(值);
}
私有对象类型ClassifyAndReturn(列表值)
{
if(values.First().ContainsKey(“self”))
{
字符串self=values.First()[“self”].Value();
if(self.Contains(“customFieldOption”))
//…然后进入一系列if-else情况以确定对象。
对象的表示作为字符串字典提供给JToken,然后可以轻松地手动检查和分配,或者在某些情况下自动反序列化(如果其中一个字段是另一个对象)

以下是对象构造函数的外观:

internal myobject(Dictionary<string, JToken> source)
{
    Self = source["self"].Value<string>();
    Id = source["id"].Value<string>();
    Value = source["value"].Value<string>();
}
内部myobject(字典源)
{
Self=源[“Self”].Value();
Id=source[“Id”].Value();
Value=source[“Value”].Value();
}

问题不在于如何反序列化,而在于如何知道要使用什么数据类型。他明确表示,“这就是所有这些,这样我们就可以告诉JSON.Net将其反序列化为什么。”这就是我困惑的根源。抱歉误解了!没关系。抱歉,也许我不太清楚。目前我正在尝试ExtensionData,看看它是否能解决我的问题。因此,虽然ExtensionData本身不是我问题的解决方案,但它确实给了我解决方案,因为Json.net显然可以反序列化为JToken对象,而尽管如此,还是要感谢你关注我的问题:)很高兴我能尝试帮助你!:D