我正在嘗試更新已發布的 Json 可序列化類中的屬性名稱,因此我需要使其向后兼容。
public class myClass
{
//[JsonIgnore] - now old json files can't be read, so this won't work...
//[JsonProperty(ReferenceLoopHandling = ReferenceLoopHandling.Error)] - didn't do anything
//[JsonProperty(nameof(NewName)] - throws error - "That already exists"
[Obselete("Use NewName instead")]
public List<string> OldName { get => newName; set => newName = value; }
public List<string> NewName { get; set; } = new List<string>();
}
我像這樣使用它:
[Test]
public void test()
{
var foo = new myClass()
{
OldName = { "test" },
};
var bar = JsonConvert.SerializeObject(foo);
var result = JsonConvert.DeserializeObject(bar, typeof(myClass));
}
當我查看 result.NewName 中的值時,我找到了這個 list: {"test", "test"},但我期望這個串列:{"test"}
所需的行為:
- 如果有人已經在他們的代碼中使用 OldName,他們會收到一個過時的警告
- 如果有人決議包含 OldName 的舊 json 檔案,它會正確映射到 NewName
- 創建的新 json 檔案使用 NewName,并且在 json 檔案中的任何位置都找不到 OldName
- 在任何情況下,值都不會反??序列化兩次并放入同一個串列中
你將如何實作這一點?
uj5u.com熱心網友回復:
這使用 System.Text.Json 作業。
var foo = new myClass()
{
OldName = { "test" },
};
var bar = JsonSerializer.Serialize<myClass>(foo);
var result = JsonSerializer.Deserialize<myClass>(bar);
uj5u.com熱心網友回復:
嘗試這個
var foo = "{\"OldName\":[\"old test\"]}";
var fooN = "{\"NewName\":[\"new test\"]}";
var result = JsonConvert.DeserializeObject(foo, typeof(myClass));
//or
var result = JsonConvert.DeserializeObject(fooN, typeof(myClass));
var json = JsonConvert.SerializeObject(result);
json結果:
{"NewName":["new test"]}
//or
{"NewName":["old test"]}
班級
public class myClass
{
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public List<string> OldName {
get {return null; }
set {NewName=value;}
}
public List<string> NewName {get; set;}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/327256.html
上一篇:以正確的方式重新格式化json
