C# 如何将嵌套 JSON 的一部分保存到对象 属性 中,但不反序列化?
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 转换器(我从 获取)
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。使用 JsonConverter
属性修饰 DataJson
属性 并删除 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 data = Newtonsoft.Json.JsonConvert.SerializeObject(object);
如果是,请安装newton软件包。
这是我的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 转换器(我从
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。使用 JsonConverter
属性修饰 DataJson
属性 并删除 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 data = Newtonsoft.Json.JsonConvert.SerializeObject(object);
如果是,请安装newton软件包。