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

csh*_*ets 6 c# serialization json json.net

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

示例JSON:

{"simpleProperty": "value1", "json":{"a":"a1", "b":"b1"}}
Run Code Online (Sandbox Code Playgroud)

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

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

所以,如果我的C#类是:

public class MyClass
{
    public string SimpleProperty { get; set; }
    public string Json { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果我使用:

var myClass = JsonConvert.DeserializeObject<MyClass>(jsonStr);
Run Code Online (Sandbox Code Playgroud)

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

我已经考虑过为此创建一个自定义的JsonConverter,但这对于这么简单的事情来说似乎太复杂了.我必须在这里遗漏一些东西.任何方向将不胜感激.

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

Tim*_*lds 10

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

public class MyClass
{
    public string SimpleProperty { get; set; }
    public JToken Json { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这样做myClass.Json.ToString()会让你得到 JSON 作为string.


csh*_*ets 6

根据我的需要,我决定继续实施自定义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());

        }
    }
Run Code Online (Sandbox Code Playgroud)

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

UPDATE:修改后的WriteJson方法,将其序列化为JSON对象(不是字符串).