![](/img/trans.png)
[英]How to access the individual elements of a deserialized Json object in c#?
[英]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.