在尝试将一个复杂的JSON对象(JIRA问题)反序列化为一个包含字符串字段类型字典的对象时,我遇到了一点麻烦。
虽然我可以反序列化各种预先确定的对象类型(标准),但我在自定义字段方面遇到了一些困难,这些字段可能是各种类型的(它们都以customfield_
开头,后面跟着一组数字)。
自定义字段可以是浮点、字符串、布尔值、对象和对象数组。后一种情况给我带来了问题,因为在对对象进行反序列化之前,我似乎无法确定它是什么
我已经寻找了一种方法,也许可以在反序列化之前"窥探"对象中的数据,因为其中一个字段包含特定于其类型的信息。这样我就可以确定对象的类型,并告诉Json.Net将其反序列化为.
我考虑过在序列化之前解析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>();
}