我正在尝试将对象反序列化为自身。我有以下几点: -
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。
答案 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