簡體   English   中英

如何用相同的復雜道具類型序列化 object,但名稱不同

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM