DeserializeObject数组到object没有结果

时间:2016-09-23 07:29:07

标签: c# winforms json.net

当我尝试反序列化从外部源接收的json时,我的程序在使用value.first()时不会映射子对象。

private Class1 class1List;

public List<Class1> Class1List
{
    get
    {
        return new List<Class1> { class1List };
    }
    set
    {
        class1List = value.First();
    }
}

如果我希望它能够工作,我必须将class1List更改为List,并且必须删除.First()。问题是List将始终只包含一个元素,对于内部存储和使用,如果我只能获取第一个元素并将其存储为对象,那将是最好的。我收到的json不能改变。 (如果序列化我的对象,json看起来一样)。

{
  "Class1List":[
    {"Class2List":[
      {"Name":"test"}
    ]}
]}

编辑:删除get使其正常工作 编辑2:改变get to this也使它工作

get
{
    if (class1List != null)
    {
        return new List<Class1> { class1List };
    }
    return null;
}

2 个答案:

答案 0 :(得分:1)

如果你是那个特别没有添加私人成员我尝试了另一个解决方案

  var selctedList = JObject.Parse("YOUR JSON").SelectToken("Class1List").ToString();

  var class1List = JsonConvert.DeserializeObject<Class1[]>(selctedList, new Class1Converter());



  public class Class1
        {
            public string Name { get; set; }
        }

  public class Class1Converter : JsonCreationConverter<Class1>
        {
            protected override Class1 Create(Type objectType, JObject jObject)
            {
                return new Class1();
            }

        }

        public abstract class JsonCreationConverter<T> : JsonConverter
        {

            protected abstract T Create(Type objectType, JObject jObject);

            public override bool CanConvert(Type objectType)
            {
                return typeof(T).IsAssignableFrom(objectType);
            }

            public override object ReadJson(JsonReader reader,
                                            Type objectType,
                                             object existingValue,
                                             JsonSerializer serializer)
            {
                try
                {

                    // Load JObject from stream
                    JObject jObject = JObject.Load(reader);

                    var lp = jObject[jObject.Properties().Select(p => p.Name).FirstOrDefault()];

                    JObject kl = JsonConvert.DeserializeObject<JObject[]>(lp.ToString()).FirstOrDefault();

                    // Create target object based on JObject
                    T target = Create(objectType, kl);

                    // Populate the object properties
                    serializer.Populate(kl.CreateReader(), target);

                    return target;
                }
                catch (Exception er)
                {
                    throw er;
                }
            }

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

答案 1 :(得分:0)

免责声明:我在某处读到了它,但我现在无法找到来源,我的解释可能有误,但解决方案有效。

Json.Net要求您返回Json.Net在解析过程中创建的对象。

class BaseClass
{

    internal Class1 class1List;
    private List<Class1> _class1List;
    public List<Class1> Class1List
    {
        get
        {
            return _class1List;
            // return new List<Class1> { class1List };
        }
        set
        {
            class1List = value.First();
            _class1List = value;
        }
    }
}