How to serialize a raw json field?
Asked Answered
P

2

14

I have a field in the db that store a json string and I want that when I return it in a json result that will be returned as json raw data and not warped with quotes as string.

UPDATE 1(More Info): if you looking at the images field it contain a raw json string value
but after serialize it with the JsonResult it get warped with quotes that it ok because is a type of String, how can i tell the serializer to treat the images field as a raw json data?

        var db = new ModelsContainer();
        var res = db.Images.OrderByDescending(i=>i.DateCreated).Skip(skip).Take(take).Select( i => new {
            id = i.Id,
            dateCreated = i.DateCreated,
            images =  i.Images ,
            user = new {
                id = i.User.Id,
                facebookId = i.User.FacebookId,
                displayName = i.User.DisplayName
            },
            tags = i.Tags.Select( t => t.Value )
        }).ToList();

        return Json(res, JsonRequestBehavior.AllowGet);

     [
        {
            "id":"5c528e88-f3a7-4b30-9746-980867325fd1",
            "dateCreated":"\/Date(1364381593000)\/",
            "images":"[{\"source\":\"http://localhost:9242/images/f4956702/6d34/42db/b28a/397d0eaf3097.jpg\",\"width\":237,\"height\":237},{\"source\":\"http://localhost:9242/images/87d47041/1522/4d10/9325/105851aae259.jpg\",\"width\":633,\"height\":633},{\"source\":\"http://localhost:9242/images/2a639272/9067/42fb/83ee/e88f0a0878f8.jpg\",\"width\":547,\"height\":547},{\"source\":\"http://localhost:9242/images/37caa7b2/e183/4efc/96eb/487e556501b2.jpg\",\"width\":1024,\"height\":1024}]",
            "user":{"id":"ea39616d-6ff9-424b-b99b-7bee53e674bb","facebookId":"608215901","displayName":"Yonathan Garti"},
            "tags":["test","test","test"]
        },
        ...
    ]
Peephole answered 27/3, 2013 at 14:34 Comment(0)
E
21

With Json.net you can define your own JsonConverters to apply a specific serialization behavior. You may apply it for a specific type or, if you have a view model, a specific property.

In your case you want to write the Images-string as a raw-string using JsonWriter.WriteRawValue.

Ie.

public class PlainJsonStringConverter : Newtonsoft.Json.JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string);
    }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return reader.Value;
    }
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteRawValue((string)value);
    }
}

public class MyViewModel
{
    public string id { get; set; }
    [Newtonsoft.Json.JsonConverter(typeof(PlainJsonStringConverter))]
    public string images { get; set; }
    /* ...  */
}
Enscroll answered 27/3, 2013 at 14:59 Comment(4)
your solution is great!!! but unfortunately i can't implement it because my classes are generated by Entity Framework. is there a way to tell the serializer about the one field that need a type converter not by using an attribute?Peephole
The other solution is if you have a custom type, that the JsonConverter handles, but in your case I believe it's a plain string so that won't work. My suggestion is to create a custom View model. In your code above you only need to use that custom view model instead of the anonymous object (res) you initialize.Tory
genius!!! how i wasn't see that i only need to replace the anonymous type with some model and then i will can apply the attribute!!! thanks men.Peephole
Even if you cannot decorate the generated property with an attribute, you can supply a custom ContractResolver to the serializer which will add this converter at runtime. Take a look at this question. In the CreateProperties override, you'd want to check for your specific type and add the converter to the JsonProperty for images.Endogamy
P
-1

You will need to unserialize the data. C# offers a class to handle JSON data.

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.aspx

Excerpt from http://msdn.microsoft.com/en-us/library/bb412179.aspx :

Normally, JSON serialization and deserialization is handled automatically by Windows Communication Foundation (WCF) when you use data contract types in service operations that are exposed over AJAX-enabled endpoints. However, in some cases you may need to work with JSON data directly - this is the scenario that this topic demonstrates.

//Deserialize the JSON-encoded data into a new instance of Person by using the ReadObject method of the DataContractJsonSerializer.

stream1.Position = 0;   
Person p2 = (Person)ser.ReadObject(stream1);

//Show the results.

Console.Write("Deserialized back, got name=");
Console.Write(p2.name);
Console.Write(", age=");
Console.WriteLine(p2.age);
Peeress answered 27/3, 2013 at 14:41 Comment(1)
i don't think you understand my question please read my update thanks!Peephole

© 2022 - 2024 — McMap. All rights reserved.