代码之家  ›  专栏  ›  技术社区  ›  Allfocus

返回对象名为MVC的Json结果

  •  4
  • Allfocus  · 技术社区  · 14 年前

    当控制器返回json结果时,似乎缺少对象名,我通常不会介意,但是flexbox jquery插件需要特定格式的json结果。

    需要Flexcombobox格式

    {"results":[  
         {"id":"1","name":"Ant"},  
         {"id":"2","name":"Bear"},  
         {"id":"3","name":"Cat"},  
         {"id":"4","name":"Dog"},  
         {"id":"5","name":"Elephant"},  
         {"id":"6","name":"Fox"},  
         {"id":"7","name":"Guinea Pig"},  
         {"id":"8","name":"Horse"},  
         {"id":"9","name":"Iguana"},  
         {"id":"10","name":"Jaguar"}  
     ]} 
    

    等级

    Public Class FlexboxResult
    
        Private _id As String
        Public Property Id() As String
            Get
                Return _id
            End Get
            Set(ByVal value As String)
                _id = value
            End Set
        End Property
    
        Private _name As String
        Public Property Name() As String
            Get
                Return _name
            End Get
            Set(ByVal value As String)
                _name = value
            End Set
        End Property
    
    End Class
    

    控制器代码

    Function PartYearsList() As JsonResult
                Dim yearSelectList As List(Of FlexboxResult) = New List(Of FlexboxResult)
    
                For index As Integer = DateTime.Now.Year To 1955 Step -1
                    yearSelectList.Add(New FlexboxResult() With {.Id = index, .Name = index})
                Next
    
                Return Me.Json(yearSelectList.ToArray(), JsonRequestBehavior.AllowGet)
    End Function
    

    返回的Json结果(缩写)

    [{"Id":"2010","Name":"2010"},{"Id":"2009","Name":"2009"},{"Id":"2008","Name":"2008"}]
    

    期望结果(缩短)

    {"results": [{"Id":"2010","Name":"2010"},{"Id":"2009","Name":"2009"},{"Id":"2008","Name":"2008"}]}
    

    Flexcombobox文档 http://www.fairwaytech.com/flexbox.aspx

    2 回复  |  直到 12 年前
        1
  •  16
  •   Dave Ward    14 年前

    在C#中,可以使用匿名对象调整JSON结构:

    // The ToArray() probably isn't necessary. Collections like List<T> are treated
    //  as JavaScript arrays when JavaScriptSerializer turns them into JSON.
    return Json(new { results = yearSelectList});
    

    更新:

    从Dien,这是相同的VB语法:

    Return Json(New With {Key .results = yearSelectList}, JsonRequestBehavior.AllowGet)
    
        2
  •  1
  •   Brian Hinchey    14 年前

    要获得输出JSON的细粒度控制,可以尝试声明如下数据协定:

    [DataContract]
    public class MyResultListContract
    {
        [DataMember]
        public List<MyResultContract> results { get; set; }
    }
    
    [DataContract]
    public class MyResultContract
    {
        [DataMember]
        public string Id {get; set;}
        [DataMember]
        public string Name {get; set;}
    }
    

    var myResults = ...
    var serialiser = new DataContractJsonSerializer(typeof(MyResultListContract));
    var jsonString = serialiser.WriteAsString(myResults);