将 JSON 对象属性反序列化为字符串



我有一些JSON,它具有各种属性,其中大多数是简单的数据类型。 但是,我在 JSON 中有一个属性,当我将其反序列化为 C# 类时,我只需要将其反序列化为字符串。

示例 JSON:

{"simpleProperty": "value1", "json":{"a":"a1", "b":"b1"}}

"json"对象没有设置结构,除了它是一个有效的JSON对象。

所以在上面的例子中,"json"的值是一个JSON对象——但是当它被反序列化时,我需要它作为一个字符串。

因此,如果我的 C# 类是:

public class MyClass
{
    public string SimpleProperty { get; set; }
    public string Json { get; set; }
}

然后如果我使用:

var myClass = JsonConvert.DeserializeObject<MyClass>(jsonStr);

我希望myClass.Json只是一个简单的字符串。

我已经考虑为此创建自定义 JsonConverter,但对于这么简单的事情来说,这似乎太复杂了。我一定在这里错过了什么。 任何方向将不胜感激。

我也看到了这篇文章 - 但它真的没有回答这个问题:JSON.Net - 如何将 JSON 反序列化为对象,但将属性视为字符串而不是 JSON?

也可以

使用属性的JToken类型,以指示任何有效的 JSON 都可以转到那里。 虽然这不是你所要求的,但可能就足够了。

public class MyClass
{
    public string SimpleProperty { get; set; }
    public JToken Json { get; set; }
}

执行myClass.Json.ToString()操作将使JSON作为string

为了满足我的需求,我决定继续实现一个自定义的 JsonConverter,如下所示:

    class JsonConverterObjectToString : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return (objectType == typeof(JTokenType));
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            JToken token = JToken.Load(reader);
            if (token.Type == JTokenType.Object)
            {
                return token.ToString();
            }
            return null;
        }
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            //serializer.Serialize(writer, value);
            //serialize as actual JSON and not string data
            var token = JToken.Parse(value.ToString());
            writer.WriteToken(token.CreateReader());
        }
    }

我还没有彻底测试上述实现,也不完全确定 Canconvert 方法,因为它似乎从未被调用过,但它似乎进行了转换,然后允许我将反序列化的类存储到 MongoDB 中,JSON 数据存储为字符串。 所以现在一切都很好。我发现以下内容在实现中很有帮助:如何使用 Json.NET 反序列化可以是两种不同数据类型的 JSON 属性

更新:修改了 WriteJson 方法以序列化回 JSON 对象(而不是字符串)。

相关内容

  • 没有找到相关文章

最新更新