ASP.Net MVC: how to create a JsonResult based on raw Json Data
Asked Answered
C

3

10

Having a string containing the following raw Json data (simplified for the sake of the question):

  var MyString =  "{ 'val': 'apple' }";

How can I create a JsonResult object representing MyString?

I tried to use the Json(object) method. but it handles the raw json data as an string -logically :P-. So the returned HTTP response looks like:

"{ 'val': 'apple' }"

instead of the given raw Json Data:

{ 'val': 'apple' }

this is what I want to achieve:

Collect answered 21/10, 2010 at 20:43 Comment(0)
M
24

The Json() method on Controller is actually a helper method that creates a new JsonResult. If we look at the source code for this class*, we can see that it's not really doing that much -- just setting the content type to application/json, serializing your data object using a JavaScriptSerializer, and writing it the resulting string.. You can duplicate this behavior (minus the serialization, since you've already done that) by returning a ContentResult from your controller instead.

public ActionResult JsonData(int id) {
    var jsonStringFromSomewhere = "{ 'val': 'apple' }";
    // Content() creates a ContentResult just as Json() creates a JsonResult
    return Content(jsonStringFromSomewhere, "application/json");
}

* Starting in MVC2, JsonResult also throws an exception if the user is making an HTTP GET request (as opposed to say a POST). Allowing users to retrieve JSON using an HTTP GET has security implications which you should be aware of before you permit this in your own app.

Mofette answered 21/10, 2010 at 21:7 Comment(2)
+1 - but according to json.org though, the keys and values need to be enclosed in double quotes and not single.Sidwell
Nice catch. I just copied the string the asker used. Of course, this whole answer assumes that you know your JSON string is valid to begin with so the client's web browser doesn't choke on it.Mofette
S
1

The way I have generated json data from a string is by using JavaScriptResult in the controller:

public JavaScriptResult jsonList( string jsonString)
{
   jsonString = "var jsonobject = new Array(" + jsonString + ");";
   return JavaScript(jsonString)
}

Then when you request pass the json string to that action in your controller, the result will be a file with javascript headers.

Solarium answered 21/10, 2010 at 21:1 Comment(0)
J
0

I think you can use the JavaScriptSerializer class for this

var js = new System.Web.Script.Serialization.JavaScriptSerializer();
var jsonObject = js.Deserialize("{ 'val': 'apple' }", typeof(object));
Jornada answered 21/10, 2010 at 20:54 Comment(2)
Would it work to serialize it as an object? I don't think the serializer adds properties to the serialized object, I think it just looks for properties on the object that match the properties in the JSON. Maybe you could try dynamic though?Wintery
This would deserialise the object only to have is serialised again.Frogman

© 2022 - 2024 — McMap. All rights reserved.