C# - 将json反序列化为动态属性名

时间:2016-11-11 06:19:59

标签: c# json dynamic json.net

我试图反序列化一个json字符串,该字符串具有一个基于no的动态生成的属性名称(例如:0,1等)。在JSON模型中,使用Test属性名称来分配动态生成的onjects的值,并且我创建了一个自定义转换器来匹配数字并将其分配给Test属性。

问题是我不确定如何在列表中设置值,因为Test属性可以有多个相同类型的值。我希望结果在数组或列表中。

自定义转换器:

public class CustomPropertyNameConverter : JsonConverter    
{
    public override bool CanConvert(Type objectType)
    {
      return objectType.IsClass;
    }


    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
     object instance = objectType.GetConstructor(Type.EmptyTypes).Invoke(null);
     PropertyInfo[] props = objectType.GetProperties();

     JObject jo = JObject.Load(reader);
     foreach (JProperty jp in jo.Properties())
     {
        string name = jp.Name;

        //Match digits
        if (Regex.IsMatch(name, "^[0-9]*$"))
        {
            name = "Test"; // Here i've assigned the property name that is defined in the Json Model
        }
        PropertyInfo prop = props.FirstOrDefault(pi => pi.CanWrite && string.Equals(pi.Name, name, StringComparison.OrdinalIgnoreCase));

        if (prop != null)
            //How to add it to List of Detail type??
            prop.SetValue(instance, jp.Value.ToObject(prop.PropertyType, serializer));
     }

     return instance;
   }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
      throw new NotImplementedException();
    }
}

模型

[JsonConverter(typeof(CustomPropertyNameConverter))]
public class Data
{
    public int group_id { get; set; }

    public Detail Test { get; set; } // Dynamic property name needs to be converted to List or Array
}

public class Detail
{
    public string id { get; set; }
    public string status { get; set; }
}

测试数据

"data": 
{
    "group_id":2758,
    "0":
    {
        "id": "1",          
        "status": "PASS"
    },
    "1":
    {
        "id": "2",       
        "status": "FAIL"
 }
}

0 个答案:

没有答案
相关问题