【问题标题】:Deserialize JSON string that supposed for object as string将对象的 JSON 字符串反序列化为字符串
【发布时间】:2021-06-02 14:36:36
【问题描述】:

我需要序列化一串 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 属性是一个对象数组。将 params 属性改为 IEnumerable&lt;string&gt; 会起作用吗?

标签: c# json json.net


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    好的解决方案:

    如果要保留json结构,可以将type改为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; }
    

    【讨论】:

      猜你喜欢
      • 2014-01-04
      • 2020-02-03
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 2012-07-18
      相关资源
      最近更新 更多