【问题标题】:problem in getting Value from Json Key Value Pair从 Json 键值对获取值的问题
【发布时间】:2019-12-31 16:49:47
【问题描述】:

我正在关注this link 来构建客户端转发器。

根据上面的链接从Json键值对中检索值我们可以使用result[i].property,例如

for (var post in msg)
{     
    var x= msg[post].Date;
    alert(x);
}

这里x 从 Json 字符串返回日期。当我尝试对我的数据使用相同的数据时,它总是返回为undefined。我试图弹出一个alert(msg.d),它显示了一个包含我所有数据的漂亮 Json 字符串。但是当我尝试msg[post].Date(property name) 时,它总是返回undefined

请帮忙..

提前致谢。

更新:

我从后端返回一个通用列表,然后使用以下代码将其转换为 Json。

公共静态字符串 ConvertToJSON(这个对象 obj) {

    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());    

    MemoryStream ms = new MemoryStream();
    serializer.WriteObject(ms, obj);
    string jsonobj = Encoding.Default.GetString(ms.ToArray());
    ms.Dispose();
    return jsonobj;
}

然后我将返回的 Json 附加到 stringbuilder 并将其返回到 Jquery ajax 方法。返回的 Json 看起来像一个字符串,而不是一个对象,因此我无法从 Json 键值对中获取任何值..

【问题讨论】:

  • 您可以发布调用 alert(msg.d) 时返回的内容吗?
  • 获取萤火虫,放置断点并查看监视窗口中的不同值。检查帖子中的内容,msg[post]。
  • 嗨 Patrick,以下是我执行 alert(msg.d) [{"AnsNo":0,"Answer":"","Category":"帮助中心时返回的示例.Mortgages.Existing customers","ClickURL":null,"ID":7,"Question":"我如何重新抵押给你?","RecNo":0,"ValidFrom":"\/Date( -62135596800000+0000)\/","ValidUntill":"\/Date(-62135596800000+0000)\/"}] 所以我正在尝试使用 msg[post].AnsNo ,msg[post].Answer, msg[post ].类别等
  • 我不明白这段代码要做什么:msg[post].Date(property name)。看来它将使用不是日期对象的property name 设置日期,但您不是在尝试读取日期吗?您能否发布更多代码
  • 您已提出 8 个问题并选择了 0 个答案。先解决这个问题,然后我会帮你的。

标签: jquery json


【解决方案1】:

更新:

听起来您在服务器端对数据进行双重序列化,返回一个 JSON 字符串,该字符串被序列化为 JSON 本身。当它到达客户端并且 jQuery 自动反序列化第一层 JSON 时,您仍然会得到您手动构建的 JSON 字符串。

您应该返回 List<T> 作为服务方法的返回值,并让框架处理 JSON 序列化。

原答案:

假设该对象仍包含在 ASP.NET AJAX's ".d" wrapper 中,正如您所暗示的那样:

for (var post in msg.d) {     
  var x = msg.d[post].Date;

  alert(x);
}

或者,一个传统的循环,可能更简单:

for (var i = 0; i < msg.d.length; i++) {
  var x = msg.d[i].Date;

  alert(x);
}

【讨论】:

  • 感谢 Dave,在阅读了您的帖子后,我意识到我正在对数据进行双重序列化。这是一个愚蠢的错误。现在我可以使用 msg.d[0].Date 读取值。但是遇到了另一个问题。基本上在 web 方法后面的代码中我有不同的条件。根据条件不同的通用列表(ex.faqs,recognitions 等)返回到 Jquery ajax 方法。我不明白如何设置返回类型(通用列表)基于使用您的解决方案的条件的 Web 方法。以前我曾经将从 Converttojson 返回的字符串附加到字符串生成器并返回。
  • 使用 IEnumerable 作为返回类型。
  • 返回 IEnumerable 看起来是个好主意。在我的代码中,我有一些条件必须从多个通用列表中检索数据。例如,如果满足条件,我需要执行以下操作。 Recognitionfactory rf = new Recognitionfactory();认可 rs= rf.getBasicSearchRecognitions(searchtext); Answerfactory af = new Answerfactory();答案 ans = af.getBasicSearchAnswers(searchtext);在上述情况下,我需要在满足某个条件时返回两个 rs,ans(通用列表)。如何在一个条件下同时返回它们?
  • 当然,可以返回 ans 或 rs,ienumerable 是 web 方法的返回类型。如何处理同时返回 ans,rs
  • 一个 IEnumerable 可以包含一个 IEnumerables 的集合。不过,这听起来很难处理。您确定不应该将其重构为单独的方法吗?或者,也许使用一个通用的 DTO 类(例如 SearchResults)并将各种可能的结果映射到 List?
【解决方案2】:

消息怎么样,如果你把它添加到你的 ajax 中会有帮助吗?

dataFilter: function(data) {
  var msg;
  if (typeof(JSON) !== 'undefined' &&
    typeof(JSON.parse) === 'function')
    msg = JSON.parse(data);
  else
    msg = eval('(' + data + ')');
  if (msg.hasOwnProperty('d'))
    return msg.d;
  else
    return msg;
},

请注意,您随后会将其处理为 msg,而不是像这样的 msg.d:

success: function(msg) {
  SaveSuccess(msg);
},

【讨论】:

    【解决方案3】:

    在我看来,您开始使用一组对象,使用您的示例进行以下工作:

    messages = [{"AnsNo":0,"Answer":"","Category":"Help Centre.Mortgages.Existing customers","ClickURL":null,"ID":7,"Question":"How do I re-mortgage to you?","RecNo":0,"ValidFrom":"\/Date(-62135596800000+0000)\/","ValidUntill":"\/Date(-62135596800000+0000)\/"}]
    
    for(i in messages)
    {
        message = messages[i];
        //Says "Help Centre.Mortgages.Existing customers"
        alert(message.Category)
        //To get all key/value pairs
        for(key in message)
        {
            //Alerts all key value pairs one by one
            alert("Key:" + key + ", Value:" + message[key]);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多