反序列化复杂的字符串

时间:2014-03-04 10:42:17

标签: c# json serialization

这是我的班级

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);

我无法做到。请提出您的意见和建议

2 个答案:

答案 0 :(得分:0)

为什么不使用动态类型对其进行反序列化?

JsonConvert.DeserializeObject<dynamic>(jsonResp);

由于应用于“Answers”词典的“数组”样式键,我不认为您的输入JSON在运行时适合C#模型 - 例如; Q1,Q2,Q3

此外,我通常会在我的类上使用DataContract属性,并在我的成员上使用DataMember属性来指示需要序列化。

答案 1 :(得分:0)

json的问题是Value可能包含intstringstring 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();
    }
}