喂,伙计们,我有些问题要弄明白为什么会发生这种事
我有一门课,我试图把它反序列化:
public class TextConceptValidationJob : ConceptValidationJob<ConceptTextItem, BooleanTermAnswer>
{
[JsonConstructor]
public TextConceptValidationJob(string id, TaskType taskType, ConceptTextItem wordItem, IList<BooleanTermAnswer> answerContainers) : this (id, taskType, wordItem, answerContainers, new List<string>())
{
Debug.Log (id);
Debug.Log (taskType);
Debug.Log (wordItem);
Debug.Log (answerContainers[0].Term);
}
public TextConceptValidationJob(string id, TaskType taskType, ConceptTextItem wordItem, IList<BooleanTermAnswer> answerContainers, IList<string> goldAnswers) : base (id, taskType, wordItem, answerContainers, goldAnswers)
{
}
public string Text
{
get
{
return item.Text;
}
}
public string Target
{
get
{
return item.Target;
}
}
protected override string GetAnnotationString<U> (AnswerContainer<U> answerContainer)
{
return answerContainer.Query;
}
public override string ToString ()
{
return base.JobId + "\t" + Target;
}
}Debug.Log打印:
空
正确的枚举对象
空
具有正确对象的正确列表
所有对象都在TextConceptValidationJob的抽象超类中,如下所示:
[DataContract]
public abstract class Job <I, T, K> where I : Item where T : AnswerContainer<K>
{
private string jobId;
private readonly TaskType taskType;
protected IList<T> answerContainers;
protected I item;
public Job (string jobId, TaskType taskType, I item) : this (jobId, taskType, item, new List<string>())
{
}
public Job (string jobId, TaskType taskType, I item, IList<string> goldAnswers)
{
this.jobId = jobId;
this.taskType = taskType;
this.task = GetTaskFromType (taskType);
this.item = item;
this.goldAnswers = goldAnswers;
}
[DataMember(Name = "jobId")]
public string JobId
{
get
{
return jobId;
}
}
[DataMember(Name = "item")]
public I Item
{
get
{
return item;
}
}
[DataMember(Name = "answerContainers")]
public IList<T> AnswerContainers
{
get
{
return answerContainers;
}
}
[DataMember(Name = "task")]
public TaskType TaskType
{
get
{
return taskType;
}
}
}这就是我不能反序列化的示例json:
{
"jobId":"DISAMBIGUATION#2460",
"item":{
"target":"waste",
"text":"A piece of land where waste materials are dumped",
"id":"DISAMBIGUATION#2460#44"
},
"answerContainers":[
{
"term":"agriculture (Farming)",
"id":"DISAMBIGUATION#2460#44",
"isSent":false,
"query":"agriculture (Farming)",
"lang":"EN"
},
{
"term":"agriculture (Farming)",
"id":"DISAMBIGUATION#2460#44",
"isSent":false,
"query":"agriculture (Farming)",
"lang":"EN"
},
{
"term":"agriculture (Farming)",
"id":"DISAMBIGUATION#2460#44",
"isSent":false,
"query":"agriculture (Farming)",
"lang":"EN"
},
{
"term":"agriculture (Farming)",
"id":"DISAMBIGUATION#2460#44",
"isSent":false,
"query":"agriculture (Farming)",
"lang":"EN"
},
{
"term":"agriculture (Farming)",
"id":"DISAMBIGUATION#2460#44",
"isSent":false,
"query":"agriculture (Farming)",
"lang":"EN"
}
],
"task":"DISAMBIGUATION"对于序列化和反序列化,我使用JSON.NET:
TextConceptValidationJob o = new TextConceptValidationJob("DISAMBIGUATION#2460", TaskType.DISAMBIGUATION, item, list);
string serialized = JsonConvert.SerializeObject (o);
JsonConvert.DeserializeObject<TextConceptValidationJob> (serialized);你知道会是什么吗?也许这是我错过的愚蠢的东西,但我似乎找不到问题
非常感谢
发布于 2015-11-29 10:35:36
我认为问题在于参数的名称: Json.NET要求构造函数参数的名称与属性的名称相匹配。在您的示例中,至少在您发布的部分中,您在TextConceptValidationJob上有一个"id“参数,但是参数(和属性)在jobId上被称为jobId。
解决方案:重命名Json.NET调用的构造函数中的参数,以匹配由作业超类定义的属性的实际名称。
祝好运!
编辑:提供的解决方案要求您更改Json的签名。如果不能,您可以在派生类中实现id和wordItem两个属性,这应该只复制基本jobId和item属性上的值。
public string id
{
get { return jobId; }
set { jobId = value; }
}
public string ConceptTextItem
{
get { return item; }
set { item = value; }
}https://stackoverflow.com/questions/33976928
复制相似问题