2014-04-14 46 views
0

试图将复杂的JSON对象(JIRA问题)反序列化为包含string-Field类型字典的对象时,我碰到了一点凹凸。虽然我可以反序列化各种预先确定的对象类型(标准),但我对自定义字段有一些困难,这些字段可能是各种类型的(它们都以customfield_开头,后跟一个一组数字)。在json反序列化过程中确定对象“类型”

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

我已经搜索了一种方法,以便在反序列化之前对对象中的数据进行“窥视”,因为其中一个字段包含特定于其类型的信息。这一切都可以确定对象的类型,并告诉Json.Net将其反序列化为。

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

在此先感谢您的任何建议。

回答

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

的问题不是如何反序列化,但如何知道是干什么用的数据类型。 – mdoar

+0

他明确指出:“这一切都可以告诉JSON.Net将其反序列化为。”这是我混乱的根源。很抱歉对于这个误会! – Bill

+0

没关系。对不起,也许我不清楚它。目前我正在尝试使用ExtensionData来查看它是否解决了我的问题。 http://james.newtonking.com/archive/2013/05/08/json-net-5-0-release-5-defaultsettings-and-extension-data –

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>(); 
} 
相关问题