2011-02-04 11 views
4

.NETのjsonでjavascript関数を送信しようとしていますが、オブジェクトのシリアル化に問題があります。Json.NETライブラリを使用してjson経由でjavascript関数を送信

javacriptライブラリHighchartsは、jsonオブジェクトで次の関数を使用してチャートのツールチップをカスタマイズします。

tooltip: { 
     formatter: function() { 
      var s; 
      if (this.point.name) { // the pie chart 
       s = ''+ 
        this.point.name +': '+ this.y +' fruits'; 
      } else { 
       s = ''+ 
        this.x +': '+ this.y; 
      } 
      return s; 
     } 
     }, 

私はそのようなオブジェクトを作成するために、匿名型を使用して人気のJson.NETライブラリを使用しようとしていますが、すべての私の努力は、最後の文字列にシリアライズ。どんな助けもありがとうございます。ありがとう!

+2

JSONは、機能をシリアル化しません。 – Sean

答えて

3

JSONという名前は、オブジェクト表記であり、オブジェクトとして状態を転送するのに適しています。

JavaScriptコード自体を送信する必要がある場合は、ASP NET MVCを使用している場合はJavaScriptResultを使用できます。

ASP NET Webフォームを使用している場合は、JavaScriptを直接レスポンスに書き込むASPXファイルを用意してください。 ContentTypetext/javascriptに変更してください。

2

ハックのビットが、私はそれをこのように解決:FUNCプレースホルダと私の機能を囲むと、私は機能を取得し、生成JSONでemtpy文字列で「FUNCとFUNC」を置き換えることによって

string linkUrl = "http://www.google.com"; 
dynamic result = new ExpandoObject(); 
result.render = "FUNCfunction (data) { return '<a href=\"" + linkUrl + "\">' + data + '</a>'; }FUNC"; 
var json = Newtonsoft.Json.JsonConvert.SerializeObject(result).Replace("\"FUNC", "").Replace("FUNC\"", "") 

を私のjsonオブジェクトで。

0

私は一般的な方法により、上記の例に触発されました:

public class FunctionConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return (objectType == typeof(String)); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     serializer.Serialize(writer, String.Concat("<Function>", value, "</Function>")); 
    } 
} 

public static class JsonObjectExtensions 
{ 
    public static String CleanJson(this String s) 
    { 
     return s.Replace("\"<Function>", "").Replace("</Function>\"", ""); 
    } 
} 

public partial class JsonObject 
{ 
    public String ToJson() 
    { 
     return JsonConvert.SerializeObject(this).CleanJson(); 
    } 
} 

とモデルデータ:

public class ConfigModel : JsonObject 
{ 
    [JsonProperty("altFormat", NullValueHandling = NullValueHandling.Ignore)] 
    public String altFormat { get; set; } 

    [JsonProperty("onClose", NullValueHandling = NullValueHandling.Ignore)] 
    [JsonConverter(typeof(FunctionConverter))] 
    public String onClose { get; set; } 

} 
+1

ようこそStackOverflowへ。あなたの答えを読んでいる人を助けるためには、コードの説明をもっと奨励してください。それは別の答えよりも優れています/このようにした理由/質問に答えるのを助ける方法自体。 – Klors

2

私はObOzOneから答えを好きですが、それだけで少し簡単になることができますWriteRawValueを使用します。たとえば:あなたはシリアライズしたい

public class FunctionSerializer : JsonConverter 
 
{ 
 
    public override bool CanConvert(Type objectType) 
 
    { 
 
     return (objectType == typeof(string)); 
 
    } 
 

 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
 
    { 
 
     throw new NotImplementedException(); 
 
    } 
 

 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
 
    { 
 
     string valueAsString = Convert.ToString(value); 
 

 
     if (!string.IsNullOrWhiteSpace(valueAsString)) 
 
      writer.WriteRawValue(valueAsString); 
 
    } 
 
}

そしてあなたの財産上:

[JsonConverter(typeof(FunctionSerializer))] 
 
public string HideExpression { get; set; }

関連する問題