【问题标题】:How do you convert encoded JSON string properties when calling JsonConvert.SerializeObject?调用 JsonConvert.SerializeObject 时如何转换编码的 JSON 字符串属性?
【发布时间】:2018-08-22 21:49:09
【问题描述】:

我有一个 POCO,其中包含一些包含编码 JSON 对象的字符串属性。

当我调用 JsonConvert.SerializeObject 时,我想将这些字符串转换回 JSON 并让 Json.NET 将它们序列化为嵌入的 JSON 对象。

在调用 JsonConvert.SerializeObject 时如何转换编码的 JSON 字符串属性?

以下是相关代码:

public class LogAction
{
    // other properties
    public string Request { get; set; }
    public string Response { get; set; }
}

这是设置 Response 属性的代码行:

Response = actionExecutedContext.Response?.Content?.ReadAsStringAsync().Result

我包含这行代码来演示该属性是使用一种方法设置的——ReadAsStringAsync,它返回一个编码的 JSON 字符串。在我的情况下,它将始终是一个编码的 JSON 字符串,否则它将为空。

想法?

【问题讨论】:

  • 对 JSON 数据使用 JRaw 类型而不是字符串。
  • 我做不到。我将此类用作实体框架中的实体。如果有属性,我不介意拥有一个属性

标签: c# json json.net


【解决方案1】:

您可以通过将转换器属性放在 JSON 属性上方来使用特定于属性的转换器:

public class LogAction
{
  // other properties
  [JsonConverter(typeof(RawJsonConverter))]
  public string Request { get; set; }
  [JsonConverter(typeof(RawJsonConverter))]
  public string Response { get; set; }
}

转换器将如下所示,并按照假设它们已经是 JSON 的方式写入字符串。

public class RawJsonConverter: JsonConverter
{
  public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
  {
    return JObject.Load(reader).ToString();
  }

  public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
  {
    writer.WriteRawValue((string)value);
  }

  public override bool CanConvert(Type objectType)
  {
    return objectType == typeof(string);
  }
}

【讨论】:

    【解决方案2】:

    @ckuri 让我走上了正确的道路,因此我将他的回复标记为答案,但我最终选择了不同的实现。

    这就是我更改实现的原因:

    • 编码的字符串可以是一个对象,也可以是一个数组。
    • 如果编码的字符串属性不能,我想要一个明确的错误消息 被解析。
    • 我在使用 JToken.Load(reader) 调用时发现了一些缓冲区溢出问题。

    我希望这对其他人有帮助。

        /// <summary>
        /// The RawJsonConverter is used to convert an object's string-typed properties containing valid string-encoded
        /// JavaScript Object Notation (JSON) into non-encoded strings so that they may be treated as JSON objects and
        /// arrays instead of strings when their containing objects are serialized.
        /// Note that the properties of the object must be decorated with the JsonConverterAttribute like this:
        ///     [JsonConverter(typeof(RawJsonConverter))]
        ///     public string EncodedJsonProperty { get; set; }
        /// </summary>
        public class RawJsonConverter : JsonConverter
        {
            /// <inheritdoc />
            public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
            {
                try
                {
                    var value = serializer.Deserialize<String>(reader).Trim();
                    return JToken.Parse(value).ToString();
                }
                catch (Exception ex)
                {
                    throw new Exception("Could not parse JSON from string in RawJsonConverter.", ex);
                }
            }
    
            /// <inheritdoc />
            public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
            {
                writer.WriteRawValue((string)value);
            }
    
            /// <inheritdoc />
            public override bool CanConvert(Type objectType)
            {
                return objectType == typeof(string);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      相关资源
      最近更新 更多