我需要序列化一个JSON字符串。但在这个字符串中,它包含了我想序列化为字符串的对象。
看看这个JSON字符串
{
"action":"applyPromo",
"params":
[
{
"transacId":"M123238831",
"promotionId":16,
"promotionTypeId":1,
"amount":100,
"transacTime":"2021-03-19T12:00:30.045+10:00"
}
]
}
由于操作可以是任何东西,我需要将params存储为字符串,该字符串将在其他地方反序列化。
这是我的课:
public class RequestAction
{
public string action { get; set; }
public string params { get; set; }
public RequestAction()
{
action = params = string.Empty;
}
}
当我尝试使用JSON(Newtonsoft(反序列化字符串时,我得到了以下错误:Unexpected character encountered while parsing value: [. Path 'params', line 1, position 27.'
。
以下是我对JSON字符串进行反序列化的代码
public static RequestAction Parse(str)
{
return JsonConvert.DeserializeObject<RequestAction>(str);
}
知道如何将params
反序列化为字符串吗?
如果我理解正确,您需要params
属性作为原始字符串。实现这一点的一种方法是使用JToken:
public class RequestAction
{
public string Action { get; set; } = string.Empty;
public JToken Params { get; set; }
}
好的解决方案:
如果您想保留json结构,可以将类型更改为JToken
。然后Newtonsoft.Json将在那里存储原始Json,您不会丢失任何关于转换的信息。
替代解决方案:
您可以实现自定义json转换器。
public class ObjectTostringConverter : JsonConverter<string>
{
public override bool CanRead => true;
public override bool CanWrite => true;
public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var data = JToken.ReadFrom(reader);
return data.ToString();
}
public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer)
{
writer.WriteRaw(value);
}
}
并标记属性以使用此转换器
[JsonConverter(typeof(ObjectTostringConverter))]
public string Params { get; set; }