C#json反序列化为(this)对象内部

时间:2018-01-15 01:34:34

标签: c# json

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

   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);    
    }

但根据我得到的错误,这个词是“只读”。 我用'this.jobname =“X”;'在此之前,“这个”不是只读的。 我正在使用Newtonsof.Json。

4 个答案:

答案 0 :(得分:3)

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

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);    
    }
}

答案 1 :(得分:1)

虽然您可以为“this”属性指定值,但您无法更改“this”所指的对象。

'this'关键字引用上下文中的当前对象实例(https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/this)。

假设Load函数在另一个对象(或静态)中,您可以执行以下操作:

 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);    
 }
} 

答案 2 :(得分:1)

您可以使用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
    }
}

答案 3 :(得分:0)

如果要在没有静态方法的情况下执行此操作,则可以使用JsonSerializer.Populate method。示例代码:

df2