反序列化 JSON 假定对象为字符串的字符串

Deserialize JSON string that supposed for object as string

我需要序列化一个JSON的字符串。但是在这个字符串中,它包含了我想序列化为字符串的对象。

看看这个JSON字符串

{
    "action":"applyPromo",
    "params":
    [
        {
            "transacId":"M123238831",
            "promotionId":16,
            "promotionTypeId":1,
            "amount":100,
            "transacTime":"2021-03-19T12:00:30.045+10:00"
        }
    ]
}

因为动作可以是任何东西,我需要将 params 存储为一个字符串,它将在其他地方反序列化。

这是我的 class:

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 String

的代码
public static RequestAction Parse(str)
{
    return JsonConvert.DeserializeObject<RequestAction>(str);
}

知道如何将 params 反序列化为字符串吗?

好的解决方案:

如果要保留 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; }

如果我理解正确,您需要 params 属性 作为原始字符串。实现此目的的一种方法是使用 JToken:

public class RequestAction
{
    public string Action { get; set; } = string.Empty;
    public JToken Params { get; set; }
}