2017-06-12 88 views
1

我有一个类型和JSON字符串可序列化到这种类型的开箱:如何反序列化JSON字典到自定义类型

public class MyVar 
{ 
    public string Content { get; set; } 
    public string Type { get; set; } 
} 

public class TypeA 
{ 
    public string Name { get; set; } 
    public Dictionary<string, MyVar> Vars { get; set; } 
} 

是否可以反序列化同样JSON字符串包装字典的自定义类型?

public class MyVars 
{ 
    private IDictionary<string, MyVar> _vars; 

    public MyVar this[string key] 
    { 
     get { ... } 
     set { ... } 
    } 
    ... 
} 

public class TypeA 
{ 
    public string Name { get; set; } 
    public MyVars Vars { get; set; } 
} 
+1

你为什么不只是使用的文档? http://www.newtonsoft.com/json/help/html/SerializingJSON.htm JsonConvert.DeserializeObject (输出); –

+0

它不会是你引入了新的包装类的Json字符串。运行它通过序列化程序来查看新的json字符串... – Wheels73

+0

只需在'TypeA'中用'public MyVars Vars {get; set;}'并且你的'MyVars'实现'IDictionary '? – Oliver

回答

0

找到它。我必须使用JsonConverter属性。

[JsonConverter(typeof(MyVarsConverter))] 
public MyVars Vars { get; set; } 

和转换器的实现必须做从字典改造的MyVars实例:

public class MyVarsConverter : JsonConverter 
{ 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var dictionary = serializer.Deserialize<Dictionary<string, MyVar>>(reader); 
     var myVars = new MyVars(dictionary); 
     return myVars; 
    } 
    ... 
} 
0

您可以使用Jobject执行此操作,使用Jobject提取值并将其设置为您想要的属性。 对于如我有一个Jobject祚

var name jo.GetValue("Name ").ToString(); 

你可以通过Jobject循环,并提取与设定值,以自定义模式。