2010-11-24 3 views
4

У меня есть способ сделать это:JsonResult эквивалентно [DataMember (Name = "Test")]

public JsonResult Layar(string countryCode, string timestamp, string userId, 
         string developerId, string layarName, double radius, 
         double lat, double lon, double accuracy) 
{ 
    LayarModel model = new LayarModel(lat, lon, radius); 

    return Json(model, JsonRequestBehavior.AllowGet); 
} 

возвращает этот объект:

public class LayarModel 
{   
    private List<HotSpot> _hotSpots = new List<HotSpot>(); 
    public List<HotSpot> HotSpots { get { return _hotSpots; } set { _hotSpots = value; } }  
    public string Name { get; set; }  
    public int ErrorCode { get; set; } 
    public string ErrorString { get; set; } 
} 

Я хочу JSON быть

{"hotspots": [{ 
    "distance": 100, 
    "attribution": "The Location of the Layar Office", 
    "title": "The Layar Office", 
    "lon": 4884339, 
    "imageURL": http:\/\/custom.layar.nl\/layarimage.jpeg, 
    "line4": "1019DW Amsterdam", 
    "line3": "distance:%distance%", 
    "line2": "Rietlandpark 301", 
    "actions": [], 
    "lat": 52374544, 
    "type": 0, 
    "id": "test_1"}], 
"layer": "snowy4", 
"errorString": "ok", 
"morePages": false, 
"errorCode": 0, 
"nextPageKey": null 
} 

Все выдается заглавными как в классе, возвращаемом (HotSpots вместо hotspots).

Я пробовал DataContract и DataMembers (Name = "Test"), но это не работает. Какие-либо предложения?

ответ

1

JsonResult() использует встроенный JavaScriptSerializer для сериализации, и, похоже, он не поддерживает определение сериализованных имен свойств с использованием атрибутов.

DataContractJsonSerializer поддерживает это, так что это может быть путь.

Некоторые ссылки, которые могут быть полезны:

0

Я бы также рекомендовал установка json.NET, но остальное намного проще. Ниже приведен метод расширения, который я использую в своем текущем приложении, чтобы обеспечить лучшее повторное использование, не стесняйтесь адаптировать его к вашим потребностям, но он должен делать то, что вам нужно прямо из коробки.

public class JsonNetResult : ActionResult 
{ 
    public Encoding ContentEncoding { get; set; } 
    public string ContentType { get; set; } 
    public object Data { get; set; } 

    public JsonSerializerSettings SerializerSettings { get; set; } 
    public Formatting Formatting { get; set; } 

    public JsonNetResult() 
    { 
     SerializerSettings = new JsonSerializerSettings 
      { 
       //http://odetocode.com/blogs/scott/archive/2013/03/25/asp-net-webapi-tip-3-camelcasing-json.aspx 
       #if DEBUG 
       Formatting = Formatting.Indented, //Makes the outputted Json easier reading by a human, only needed in debug 
       #endif 
       ContractResolver = new CamelCasePropertyNamesContractResolver() //Makes the default for properties outputted by Json to use camelCaps 
      }; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
      throw new ArgumentNullException("context"); 

     HttpResponseBase response = context.HttpContext.Response; 

     response.ContentType = !string.IsNullOrEmpty(ContentType) 
            ? ContentType 
            : "application/json"; 

     if (ContentEncoding != null) 
      response.ContentEncoding = ContentEncoding; 

     if (Data != null) 
     { 
      JsonTextWriter writer = new JsonTextWriter(response.Output) {Formatting = Formatting}; 

      JsonSerializer serializer = JsonSerializer.Create(SerializerSettings); 
      serializer.Serialize(writer, Data); 

      writer.Flush(); 
     } 
    } 
} 

public static class JsonNetExtenionMethods 
{ 
    public static ActionResult JsonNet(this Controller controller, object data) 
    { 
     return new JsonNetResult() {Data = data}; 
    } 

    public static ActionResult JsonNet(this Controller controller, object data, string contentType) 
    { 
     return new JsonNetResult() { Data = data, ContentType = contentType }; 
    } 

    public static ActionResult JsonNet(this Controller controller, object data, Formatting formatting) 
    { 
     return new JsonNetResult() {Data = data, Formatting = formatting}; 
    } 
} 

Приведен пример использования.

public JsonNetResult Layar(string countryCode, string timestamp, string userId, 
         string developerId, string layarName, double radius, 
         double lat, double lon, double accuracy) 
{ 
    LayarModel model = new LayarModel(lat, lon, radius); 

    return this.JsonNet(model); 
} 

Часть отметить, что решает проблему конкретно это когда ContractResolver на JsonSerializerSettings установлено использование new CamelCasePropertyNamesContractResolver()

Таким образом, вы никогда не должны установить пользовательские снова именования.

Смежные вопросы