Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#json反序列化到(此)内部对象_C#_Json - Fatal编程技术网

C#json反序列化到(此)内部对象

C#json反序列化到(此)内部对象,c#,json,C#,Json,我正在尝试将一个对象反序列化到自身中。我有以下几点:- public class JobID { public string jobname; public string first; public string second; public string third; public string clientName; public string workflow; }

我正在尝试将一个对象反序列化到自身中。我有以下几点:-

   public class JobID
    {
        public string jobname;
        public string first;
        public string second;
        public string third;
        public string clientName;
        public string workflow;
    }

    public void load(string fname)
    {
        string s = File.ReadAllText(fname);
        this = JsonConvert.DeserializeObject<JobID>(s);    
    }
公共类JobID
{
公共字符串作业名;
公共字符串优先;
公共字符串第二;
公共字符串第三;
公共字符串clientName;
公共字符串工作流;
}
公共无效载荷(字符串fname)
{
字符串s=File.ReadAllText(fname);
this=JsonConvert.DeserializeObject;
}
但根据我得到的错误,这个词是“只读”的。 我使用了'this.jobname=“X”;'在此之前,很明显“这”不是只读的。
我使用的是Newtonsof.Json。

虽然可以为“this”的属性赋值,但不能更改“this”所指的对象

“this”关键字引用上下文()中的当前对象实例

假设加载函数位于另一个对象(或静态对象)内,可以执行以下操作:

 public class JobID
{
    public string jobname;
    public string first;
    public string second;
    public string third;
    public string clientName;
    public string workflow;
}

public class JobReader
{
 // Property to store deserialized object
 public JobID Job { get; set; }

 public void load(string fname)
 {
     string s = File.ReadAllText(fname);

     // Assign object to property.
     this.JobID = JsonConvert.DeserializeObject<JobID>(s);    
 }
} 
公共类JobID
{
公共字符串作业名;
公共字符串优先;
公共字符串第二;
公共字符串第三;
公共字符串clientName;
公共字符串工作流;
}
公营职业读取器
{
//属性来存储反序列化的对象
PublicJobID作业{get;set;}
公共无效载荷(字符串fname)
{
字符串s=File.ReadAllText(fname);
//将对象指定给属性。
this.JobID=JsonConvert.DeserializeObject;
}
} 

为什么不使用静态方法加载对象。例如:

public class JobID
{
    public string jobname;
    public string first;
    public string second;
    public string third;
    public string clientName;
    public string workflow;
    public static JobId Load(string fname){
        string s = File.ReadAllText(fname);
        return JsonConvert.DeserializeObject<JobID>(s);    
    }
}
公共类JobID
{
公共字符串作业名;
公共字符串优先;
公共字符串第二;
公共字符串第三;
公共字符串clientName;
公共字符串工作流;
公共静态作业ID加载(字符串fname){
字符串s=File.ReadAllText(fname);
返回JsonConvert.DeserializeObject;
}
}

您可以使用Xbotter建议的静态方法创建新实例。但出于某种原因,如果您只想将文件内容反序列化为当前对象,那么最简单的方法是:

public class JobID
{
    public string jobname;
    public string first;
    public string second;
    public string third;
    public string clientName;
    public string workflow;

    public void load(string fname)
    {
        string s = File.ReadAllText(fname);
        JobID tmp = JsonConvert.DeserializeObject<JobID>(s);
        copy(tmp);
    }

    public void copy(JobID tmp)
    {
        this.jobname = tmp.jobname;
        // do the same for other properties that you want to copy
    }
}
公共类JobID
{
公共字符串作业名;
公共字符串优先;
公共字符串第二;
公共字符串第三;
公共字符串clientName;
公共字符串工作流;
公共无效载荷(字符串fname)
{
字符串s=File.ReadAllText(fname);
JobID tmp=JsonConvert.DeserializeObject;
副本(tmp);
}
公开作废副本(JobID tmp)
{
this.jobname=tmp.jobname;
//对要复制的其他属性执行相同的操作
}
}

如果要在不使用静态方法的情况下执行此操作,可以使用。示例代码:

public class JobID
{
    public string jobname;
    public string first;
    public string second;
    public string third;
    public string clientName;
    public string workflow;

    public void load(string fname)
    {
        string s = File.ReadAllText(fname);
        new JsonSerializer().Populate(new JsonTextReader(new StringReader(s)), this);
    }
}

C和C是两种不同的语言。请使用正确的标记。我现在明白了,因为JsonConvert创建对象,而不仅仅是填充对象。(灯亮了!)我学到了一些新东西——至少是如何用这种方式使用静电——谢谢。