Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Deserialize JSON object property to string

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?

like image 897
csheets Avatar asked May 01 '15 01:05

csheets


1 Answers

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).

like image 89
csheets Avatar answered Sep 21 '22 12:09

csheets