首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSON.NET一些字段在反序列化后为空

JSON.NET一些字段在反序列化后为空
EN

Stack Overflow用户
提问于 2015-11-28 22:03:07
回答 1查看 929关注 0票数 0

喂,伙计们,我有些问题要弄明白为什么会发生这种事

我有一门课,我试图把它反序列化:

代码语言:javascript
复制
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的抽象超类中,如下所示:

代码语言:javascript
复制
[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:

代码语言:javascript
复制
{  
   "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:

代码语言:javascript
复制
    TextConceptValidationJob o = new TextConceptValidationJob("DISAMBIGUATION#2460", TaskType.DISAMBIGUATION, item, list);
    string serialized = JsonConvert.SerializeObject (o);
    JsonConvert.DeserializeObject<TextConceptValidationJob> (serialized);

你知道会是什么吗?也许这是我错过的愚蠢的东西,但我似乎找不到问题

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-29 10:35:36

我认为问题在于参数的名称: Json.NET要求构造函数参数的名称与属性的名称相匹配。在您的示例中,至少在您发布的部分中,您在TextConceptValidationJob上有一个"id“参数,但是参数(和属性)在jobId上被称为jobId。

解决方案:重命名Json.NET调用的构造函数中的参数,以匹配由作业超类定义的属性的实际名称。

祝好运!

编辑:提供的解决方案要求您更改Json的签名。如果不能,您可以在派生类中实现id和wordItem两个属性,这应该只复制基本jobId和item属性上的值。

代码语言:javascript
复制
public string id
{
    get { return jobId; }
    set { jobId = value; }
}
public string ConceptTextItem
{
    get { return item; }
    set { item = value; }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33976928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档