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