2013-03-27 5 views
8

私はdb内にjson文字列 を格納するフィールドを持っていますが、jsonの生データとして返されるjsonの結果で返すと、引用符で文字列を返しません。raw jsonフィールドをシリアル化する方法は?

UPDATE 1(詳細): あなたがイメージフィールドを見ている場合には、生のJSON文字列値
が含まれているが、後のタイプであるので、それはそれはOK引用符で反っ取得するJsonResultでそれをシリアル化String、 シリアライザに画像フィールドを生のjsonデータとして扱うように指示するにはどうすればよいですか?

 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"] 
     }, 
     ... 
    ] 

答えて

7

Json.netでは、独自のJsonConvertersを定義して、特定のシリアル化動作を適用できます。特定のタイプ、またはビューモデルを持っている場合は、特定のプロパティーに適用することができます。

あなたの場合は、JsonWriter.WriteRawValueを使用して、画像文字列を生の文字列として書きます。

e。

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; } 
    /* ... */ 
} 
+0

あなたのソリューションは素晴らしいです!私のクラスはEntity Frameworkによって生成されるため、残念ながら私は実装できません。シリアライザに、属性を使用しないタイプコンバータを必要とする1つのフィールドについて伝える方法はありますか? – ygaradon

+2

他の解決策は、JsonConverterが処理するカスタムタイプがある場合ですが、あなたのケースでは、それが動作しないようにプレーンストリングだと思っています。私の提案は、カスタムViewモデルを作成することです。上記のコードでは、初期化する匿名オブジェクト(res)ではなく、カスタムビューモデルを使用するだけです。 –

+0

天才!どのように私は匿名型をいくつかのモデルに置き換える必要があることを見ていなかったし、私は属性を適用することができます!ありがとう。 – ygaradon

-1

データのシリアル化を解除する必要があります。 C#では、JSONデータを処理するクラスを提供しています。

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

http://msdn.microsoft.com/en-us/library/bb412179.aspxからの抜粋:あなたはAJAX対応のエンドポイント上で公開されているサービス操作でデータコントラクト型を使用する場合

通常、JSONのシリアライズとデシリアライズは、Windows通信基盤(WCF)によって自動的に処理されます。ただし、JSONデータを直接操作する必要がある場合もあります。これは、このトピックで説明するシナリオです。

//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); 
+0

私の質問を理解しているとは思わないと思います。 – ygaradon

関連する問題