![](/img/trans.png)
[英]How do I serialize objects to include section names and concatenate different object types?
[英]How to serialize object with the same complex prop types, but different names
我有下一個模型
public class Record
{
public User User{ get; set; }
public User Sister { get; set; }
public User Mother { get; set; }
...
}
public class Customer
{
public string Name { get; set; }
public string Id { get; set; }
}
目標json,序列化后應如下所示
{
"user":{
"user_name":"UserName",
"user_id":"id"
},
"sister":{
"sister1_name":"UserName",
"sister1_id":"id"
},
"mother":{
"mother_name":"UserName",
"mother_id":"id"
}
}
問題是所有這些字段都具有相同的類型,但我需要為每個屬性提供不同的名稱。 所以在這里使用屬性不是一個選項。 我嘗試使用CustomContractResolver
,但沒有走得太遠。 有可能在屬性名稱上設置名稱解析器會很好,但據我所知這是不可能的。 我們有另一種方法可以做到干凈和可擴展嗎? PS我正在使用Newtonsoft Json,但如果有的話我會考慮其他選項
創建動態對象
您可以使用一種方法來創建一個新的 JSON object 和 append 到父 ZA8CFDE6331149EB2AC96F86。
public static void CreateUser (JObject parent, string type, string Name, string Id)
{
parent[type] = new JObject
{
[$"{type}_name"] = Name,
[$"{type}_id"] = Id
};
}
主要使用以下代碼創建並寫入控制台 json object。
var parent = new JObject();
CreateUser(parent, "user", "UserName", "UserID");
CreateUser(parent, "sister", "SisterName", "SisterID");
CreateUser(parent, "mother", "MotherName", "MotherID");
Console.WriteLine(JsonConvert.SerializeObject(parent, Formatting.Indented));
這就是 json object 想要的,
{
"user": {
"user_name": "UserName",
"user_id": "UserID"
},
"sister": {
"sister_name": "SisterName",
"sister_id": "SisterID"
},
"mother": {
"mother_name": "MotherName",
"mother_id": "MotherID"
}
}
創建對象數組
上面的例子展示了如何創建對象,下面展示了如何創建姐妹或母親的數組。
public static void AddUser (JObject parent, string type, string Name, string Id)
{
JArray arr = (JArray)parent[type] ?? new JArray();
arr.Add(new JObject
{
[$"{type}{arr.Count() + 1}_name"] = Name,
[$"{type}{arr.Count() + 1}_id"] = Id
});
parent[type] = arr;
}
你會使用上面的,
var parent = new JObject();
CreateUser(parent, "user", "UserName", "UserID");
CreateUser(parent, "mother", "MotherName", "MotherID");
AddUser(parent, "sister", "SisterName", "SisterID");
AddUser(parent, "sister", "SisterName2", "SisterID2");
Console.WriteLine(JsonConvert.SerializeObject(parent, Formatting.Indented));
結果將是,
{
"user": {
"user_name": "UserName",
"user_id": "UserID"
},
"mother": {
"mother_name": "MotherName",
"mother_id": "MotherID"
},
"sister": [
{
"sister1_name": "SisterName",
"sister1_id": "SisterID"
},
{
"sister2_name": "SisterName2",
"sister2_id": "SisterID2"
}
]
}
另一種方法是這樣的:
我們可以讓您的客戶 class 抽象並為每種類型的客戶(用戶/姐妹/母親)創建一個 class
public class Record
{
public User User { get; set; }
public Sister Sister { get; set; }
public Mother Mother { get; set; }
}
public abstract class Customer
{
public string Name { get; set; }
public string Id { get; set; }
}
[JsonPrefix(Prefix = "User")]
public class User : Customer { }
[JsonPrefix(Prefix = "Sister1")]
public class Sister : Customer { }
[JsonPrefix(Prefix = "Mother")]
public class Mother : Customer { }
現在我們為它創建 JsonPrefix 屬性和自定義序列化程序,因此生成的 json 具有前綴。
public class JsonPrefix : Attribute
{
public string Prefix { get; set; }
}
public class CustomResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var ret = new List<JsonProperty>();
foreach (var prop in base.CreateProperties(type, memberSerialization))
{
var cst = type.GetCustomAttribute<JsonPrefix>();
if (cst != null)
prop.PropertyName = $"{cst.Prefix}_{prop.PropertyName}";
ret.Add(prop);
}
return ret;
}
}
最后你這樣稱呼:
var data1 = new Record();
data1.User = new User() { Name = "Test" };
data1.Sister = new Sister() { Name = "Test2" };
data1.Mother = new Mother() { Name = "Test3" };
JsonSerializerSettings settings = new JsonSerializerSettings
{
ContractResolver = new CustomResolver(),
Formatting = Formatting.Indented
};
string json = JsonConvert.SerializeObject(data1, settings);
生成的 Json 就像您需要的一樣。 唯一的缺點是需要從客戶 class 繼承新的 class 以用於 json 中的新型數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.