确定对象"类型"在json反序列化期间

时间:2014-04-14 15:11:41

标签: c# json json.net deserialization jira

在尝试将复杂的JSON对象(JIRA问题)反序列化为包含string-Field类型字典的对象时,我遇到了一些问题。

虽然我可以反序列化各种预先确定的对象类型(标准),但我对自定义字段的处理时间有点困难,可能是各种类型(它们都以customfield_开头然后是一组数字。)

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

我已经搜索了一种方法,可能会在反序列化之前“查看”对象中的数据,因为其中一个字段包含特定于其类型的信息。这就是所以我可以确定对象的类型并告诉Json.Net将其反序列化为什么。

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

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

2 个答案:

答案 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>();
}