簡體   English   中英

C# 如何將嵌套的 JSON 的一部分保存到 object 屬性中,但不反序列化?

[英]C# How to save part of nested JSON into object property, but not deserialized?

這是我的 JSON

{
    "type": "user_settings",
    "created_at": 1610973280043,
    "data": {
        "user_id": 12345,
        "updated_at": "2021-01-18T15:34:40+03:00"
    }
}

這些是我的課:

public class BaseMessage
{
    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("created_at")]
    public long CreatedAt { get; set; }

    [JsonProperty("data")]
    public DataDTO Data { get; set; }

    public string DataJson {get; set;} // <-- Here I need string like this "{ "user_id": 12345, "updated_at": "2021-01-18T15:34:40+03:00" }"
}

public class DataDTO
{
    [JsonProperty("user_id")]
    public int UserId { get; set; }

    [JsonProperty("updated_at")]
    public DateTime? UpdatedAt { get; set; }
}

所以我需要解析“數據”(它工作正常)並將嵌套的 JSON 保存為字符串(我不知道如何)。 有沒有優雅的方法將嵌套的 JSON 保存到字符串屬性中?

像這樣的東西:

public class BaseMessage
{
    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("created_at")]
    public long CreatedAt { get; set; }

    [JsonProperty("data")]
    public DataDTO Data { get; set; }

    [JsonPropertyAsString("data")] // <-- This is my fantasy :)
    public string DataJson {get; set; }
}

正如@dbc 評論的那樣,您可以為DataJson屬性創建自定義JsonConverter ,但您還應該對從data JSON 字段映射的另一個屬性執行某些操作 - DataDTO類型的Data 我可以提出以下解決方案:

1. 自定義 JSON 轉換器(我從@dbc的回答中得到這個)

public class RawConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
       if (reader.TokenType == JsonToken.Null)
          return null;
       var raw = JRaw.Create(reader);
       return raw.ToString();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
       var s = (string)value;
       writer.WriteRawValue(s);
     }
}

2. 使用DataJson屬性裝飾您的JsonConverter屬性並刪除Data屬性的JsonPropertyAttribute

請注意,如果您不刪除JsonPropertyAttribute那么它將不起作用,因為您有兩個屬性是從同一個 JSON 字段映射的,據我所知,默認情況下 Json.NET 不支持此功能。

public class BaseMessage
{
   [JsonProperty("type")]
   public string Type { get; set; }

   [JsonProperty("created_at")]
   public long CreatedAt { get; set; }

   public DataDTO Data { get; set; }

   [JsonProperty("data")]
   [JsonConverter(typeof(RawConverter))]
   public string DataJson {get; set;}
}

3. 更新您的BaseMessage class 以便從DataJson計算Data屬性的值

public class BaseMessage
{
   private DataDTO data;

   [JsonProperty("type")]
   public string Type { get; set; }

   [JsonProperty("created_at")]
   public long CreatedAt { get; set; }

   public DataDTO Data
   {
       if (data == null)
       {
          data = JsonConvert.DeserializeObject<DataDTO>(DataJson);
       }
       return data;
   }

   [JsonProperty("data")]
   [JsonConverter(typeof(RawConverter))]
   public string DataJson {get; set;}
}

請注意,我認為這不是最好的解決方案,並且肯定還有其他更好的選擇,但在您的情況下它可能是可行的。

你的意思是用這個??

var 數據 = Newtonsoft.Json.JsonConvert.SerializeObject(object);

如果是,請安裝 newtonSoft 軟件包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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