2013-03-27 2 views
8

json 문자열 을 저장하는 db가있는 필드가 있는데 json 원시 데이터로 반환 될 json 결과로 반환하고 문자열로 따옴표로 왜곡되지 않도록 필드가 있습니다.원시 json 필드를 직렬화하는 방법은 무엇입니까?

UPDATE 1 (추가 정보) : 당신은 이미지 필드에서 보는 경우는 JsonResult와 직렬화를 한 후 그것을 확인하기 때문에이 유형이라고 따옴표와 함께 뒤틀린 얻을
하지만 원시 JSON 문자열 값을 포함 String, serializer가 이미지 필드를 원시 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에 의해 생성되기 때문에 그것을 구현할 수 없습니다. 속성을 사용하지 않고 형식 변환기가 필요한 하나의 필드에 대해 serializer에 알리는 방법이 있습니까? – ygaradon

+2

다른 해결책은 JsonConverter가 처리하는 사용자 정의 유형이있는 경우입니다.하지만 귀하의 경우에는 작동하지 않는 일반 문자열이라고 생각합니다. 내 제안은 사용자 지정보기 모델을 만드는 것입니다. 위의 코드에서 초기화하는 익명 객체 (res) 대신 해당 사용자 정의보기 모델 만 사용해야합니다. –

+0

천재 !!! 어떻게 내가 익명의 타입을 약간의 모델로 대체 할 필요가 있다는 것을 알지 못했고 그때 속성을 적용 할 수 있습니다 !!! 고마워. – ygaradon

-1

데이터를 직렬화 해제해야합니다. C#은 JSON 데이터를 처리하는 클래스를 제공합니다. http://msdn.microsoft.com/en-us/library/bb412179.aspx에서

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

발췌 :

당신이 AJAX 기반 엔드 포인트를 통해 노출되는 서비스 운영에서 데이터 계약 형식을 사용할 때 일반적으로, JSON 직렬화 및 역 직렬화는 WCF (Windows Communication Foundation)에서 자동으로 처리됩니다 . 그러나 경우에 따라 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

관련 문제