迭代JSON对象数组

时间:2013-10-28 10:15:48

标签: jquery asp.net .net json

这个问题已被多次询问和回答,但我无法让它发挥作用。我的问题看起来像oneonethird example

我想要做的是在thisthis问题中填写JSON对象的选项框。它们都略有不同,但相似,但我无法让它发挥作用。这是来自webservice的代码:

<System.Web.Script.Services.ScriptService()> _
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class Service
Inherits System.Web.Services.WebService

<WebMethod()> _
<ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _
Public Function HelloWorld(ByVal p_productCategoryId As Integer) As String
    Dim productCategory = ProductService.GetProductCategory(p_productCategoryId)

    'Dim productList = ProductService.GetProducts(productCategory)
    Dim productList = New List(Of Product)
    For cnt = 1 To 3
        Dim product = New Product(cnt)
        product.Productname = cnt.ToString & "|" & cnt.ToString
        productList.Add(product)
    Next

    Return productList.ToJSON

End Function

End Class

 <System.Runtime.CompilerServices.Extension()> _
Public Function ToJSON(Of T)(p_items As List(Of T)) As String
    Dim jSearializer As System.Web.Script.Serialization.JavaScriptSerializer = New System.Web.Script.Serialization.JavaScriptSerializer()
    Return jSearializer.Serialize(p_items)
End Function

如果我使用以下代码:

function Test() {
  $.ajax({
     type: "POST",
     url: "Service.asmx/HelloWorld",
     data: "{'p_productCategoryId' : 1 }",
     contentType: "application/json; charset=utf-8",
     dataType: "json",
     success:function(msg){
        alert(msg.d)
        },
     error: function() {
      alert("An error has occurred during processing your request.");
                        }
  });

};

我得到了这个结果:

[{"Id":1,"IsActive":false,"Category":null,"Productname":"1|1","Price":0},
{"Id":2,"IsActive":false,"Category":null,"Productname":"2|2","Price":0},
{"Id":3,"IsActive":false,"Category":null,"Productname":"3|3","Price":0}]

这似乎没问题。

如果我从msg中删除'd'。警报的结果是:

[object Object]

填写选项框的'正在进行中的'代码是这样的(目前:):

function Test() {
$.ajax({
    type: "POST",
    url: "Service.asmx/HelloWorld",
    data: "{'p_productCategoryId' : 1 }",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (msg) {
        $("#prd_id").empty().append($("<option></option>").val("[-]").html("Please select"));
        $.each(msg.d, function () {
                           $("#prd_id").append($("<option></option>").val(this['Id']).html(this['Productname']));
        });
    },
    error: function () {
        alert("An error has occurred during processing your request.");
    }
});

};

我已经尝试了几种方法从我之前提到的例子中获取它,但无济于事。使用msg.d填充选项框,其中包含字符串中的字符数。我尝试使用'getJSON'从'msg'显式创建一个JSON对象。 (那不是“数据类型”用于吗?)我不能使用命名对象,因为我没有在示例数据中看到的那样。我错过了什么?

有些我无法获取代码以查看数组有三个条目。

3 个答案:

答案 0 :(得分:1)

我可能会使用Option构造函数而不是HTML。

假设msg.d实际上是数组(.d属性是ASP.Net的东西):

success: function (msg) {
    var options = $("#prd_id")[0].options;
    options.length = 0;
    options.add(new Option("Please select", "[-]"));
    $.each(msg.d, function () {
        options.add(new Option(this.Productname, this.Id));
    });
},

Live Example | Source

Option构造函数将文本作为第一个参数,将值作为第二个参数。 options元素上的select列表有点像数组,但为了与旧浏览器兼容,而不是push您使用add(或分配给{{ 1}},或者都有效。)

如果options[options.length]是数组(不是msg),只需删除.d

.d

Live Example | Source

如果您的回复没有以正确的MIME类型发回,success: function (msg) { var options = $("#prd_id")[0].options; options.length = 0; options.add(new Option("Please select", "[-]")); $.each(msg, function () { options.add(new Option(this.Productname, this.Id)); }); }, 实际上可能是文本,而不是数组。如果是这样,您希望通过返回正确的MIME类型(msg)来修复服务器上的问题,尽管可以手动解析它:

application/json

...然后使用上面的内容。或者当然,如果它以msg = $.parseJSON(msg); 的形式回归(虽然这似乎不太可能):

msg.d

答案 1 :(得分:0)

你可以这样做:

$.each(msg.d, function (key, value) {
    $("#prd_id").append($("<option/>").val(value.Id).html(value.Productname));
});

Fiddle Demo

答案 2 :(得分:0)

我尝试根据你的问题复制我的REST WCF,它返回相同的JSON数据,以及下面的示例工作,

<script type="text/javascript">
$(document).ready(function() {
});
var GetRawList = function() {
    $.ajax({
        type: "GET",
        url: "RestService/HelloWorld",
        contentType: "application/json;charset=utf-8",
        dataType: "json",
        success: function(data) {
  //Change this "data.d" According to your returned JSON output header. 
            var result = data.d;  
   $("#prd_id").empty().append($("<option></option>").val("[-]").html("Please select"));
            $.each(result, function(key, value) {
            $("#prd_id").append($("<option/>").val(value.Id).html(value.Productname));
            });
        },
        error: function(xhr) {
            alert(xhr.responseText);
        }
    });
}