对object的DeserializeObject数组没有给出结果
本文关键字:结果 数组 object DeserializeObject | 更新日期: 2023-09-27 18:08:38
当我尝试反序列化从外部源接收的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到this也使它工作
get
{
if (class1List != null)
{
return new List<Class1> { class1List };
}
return null;
}
如果你特别不添加私人成员,我已经尝试了另一个解决方案
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();
}
}
免责声明:我在某个地方读过,但我现在找不到来源,我的解释可能是错误的,但解决方案工作
Json。Net要求您返回Json的对象。解析过程中创建的。
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;
}
}
}