这是我的班级
class Respondents
{
public string ID { get; set; }
public string version { get; set; }
public string Status { get; set; }
public int Seed { get; set; }
public string Start { get; set; }
public string End { get; set; }
public string Duration { get; set; }
public Dictionary<string, string[]> Answers { get; set; }
public Respondents()
{
Answers = new Dictionary<string, string[]>();
}
}
我试图使用下面的代码反序列化它: -
string jsonResp = File.ReadAllText(@"D:\JsonOutputFiles\Sample Survey.json");
obj = JsonConvert.DeserializeObject<Respondents>(jsonResp);
我无法做到。请提出您的意见和建议
答案 0 :(得分:0)
为什么不使用动态类型对其进行反序列化?
JsonConvert.DeserializeObject<dynamic>(jsonResp);
由于应用于“Answers”词典的“数组”样式键,我不认为您的输入JSON在运行时适合C#模型 - 例如; Q1,Q2,Q3
此外,我通常会在我的类上使用DataContract属性,并在我的成员上使用DataMember属性来指示需要序列化。
答案 1 :(得分:0)
json的问题是Value
可能包含int
,string
或string array
。即使你像其他答案中所说的那样采用动态方式,你应该在使用它之前检查它(无论是否是数组)。
我会编写一个json转换器,并将所有值转换为List<string>
var obj = JsonConvert.DeserializeObject<Respondents>(jsonResp);
public class Val
{
[JsonConverter(typeof(StringArrayConverter))]
public List<string> Value { set; get; }
}
public class Respondents
{
public string ID { get; set; }
public string Version { get; set; }
public string Status { get; set; }
public int Seed { get; set; }
public string Start { get; set; }
public string End { get; set; }
public string Duration { get; set; }
public Dictionary<string,Val> Answers { get; set; }
}
public class StringArrayConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}
public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
{
if (reader.ValueType == typeof(long))
{
return new List<string>() { reader.Value.ToString() };
}
if (reader.ValueType == typeof(string))
{
return new List<string>() { (string)reader.Value };
}
return serializer.Deserialize<List<string>>(reader);
}
public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
{
throw new NotImplementedException();
}
}