在尝试将复杂的JSON对象(JIRA问题)反序列化为包含string-Field类型字典的对象时,我遇到了一些问题。
虽然我可以反序列化各种预先确定的对象类型(标准),但我对自定义字段的处理时间有点困难,可能是各种类型(它们都以customfield_
开头然后是一组数字。)
自定义字段可以是浮点数,字符串,布尔值,对象和对象数组。后者导致了我的问题,因为在我反序列化之前,我似乎无法确定对象是什么。
我已经搜索了一种方法,可能会在反序列化之前“查看”对象中的数据,因为其中一个字段包含特定于其类型的信息。这就是所以我可以确定对象的类型并告诉Json.Net将其反序列化为什么。
我考虑过在序列化之前解析JSON字符串以获取信息,或者可能只是在遇到这种特殊情况时,但也许有更好的方法?
提前感谢您对此提出的任何建议。
答案 0 :(得分:0)
您可以使用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; }
}
}
答案 1 :(得分:0)
而不是峰值,您可以反序列化为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>();
}