Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I have some JSON that has a variety of properties most of which are simple data types. However, I have one property in the JSON that when I deserialize it to a C# class I simply need it to be deserialized as a string.

Example JSON:

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

The "json" object has no set structure other than it will be a valid JSON object.

So in the above example the value of "json" is a JSON object -- but when it gets deserialized, I need it as a string.

So if my C# class is:

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

And then if I use:

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

I would like myClass.Json to just be a simple string.

I have looked at creating a custom JsonConverter for this but that seems way too complex for something this simple. I must be be missing something here. Any direction would be greatly appreciated.

I also saw this post -- but it really doesn't answer the question: JSON.Net - How to deserialize JSON to object but treating a property as a string instead of JSON?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
428 views
Welcome To Ask or Share your Answers For Others

1 Answer

For my needs, I decided to go ahead and implement a custom JsonConverter as follows:

    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());

        }
    }

I have not thoroughly tested the above implementation and I am not entirely sure about the Canconvert method as it never seemed to get invoked, but it seems to do the conversion and then allows me to then store the deserialized class into MongoDB and the JSON data is being stored a string. So all is good for now. I found the following helpful in the implementation: How to deserialize a JSON property that can be two different data types using Json.NET

UPDATE: modified WriteJson method to serialize back out as JSON object (not a string).


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...