【问题标题】:JSON.parse not parsing Json string. Serializing with JavaScriptSerializerJSON.parse 不解析 Json 字符串。使用 JavaScriptSerializer 进行序列化
【发布时间】:2013-01-29 22:24:56
【问题描述】:

我有一个从控制器到视图的序列化字符串:

控制器:

var serialize = new JavaScriptSerializer();
return Json(new
{
data = serialize.Serialize(obj)
}, JsonRequestBehavior.AllowGet);

Json 字符串:

[{"indiceName":"Caracter","indiciId":24,"indiceId":1,"tamanhoIndice":10,"mask":null,"indiceObr":1},

{"indiceName":"Numérico","indiciId":25,"indiceId":2,"tamanhoIndice":10,"mask":null,"indiceObr":0},

{"indiceName":"AlfaNumérico","indiciId":26,"indiceId":3,"tamanhoIndice":10,"mask":null,"indiceObr":0}]

据我所知,现代浏览器应该能够用一个简单的 json.parse()

查看:

success: function (data) 
         {
            $('.dinamic').remove();
            console.log(data);
            var obj2 = JSON.parse(data);
            console.log(obj2);
         }

我可以在第一个 console.log 中看到该字符串,但从第二个中我什么也没得到。 还有什么我应该看的,因为我读过的所有帖子都只是用一个 JSON.parse 做的简单。 我正在使用最新版本的 google chrome、firefox 和 IE,所以它应该可以工作。

【问题讨论】:

  • 你从console.log(data);得到什么?如果你console.log(typeof data); 怎么办?
  • “Json 字符串”下的 sn-p 似乎是一个对象数组,而不是一个字符串。很多时候jQuery.ajax(看起来你正在使用?)会为你处理parse
  • 成功函数是怎么调用的?
  • @Cerbrus :从数据中我得到了上面的 Json 字符串,typeof 说它是一个对象。
  • Data 已经被 jQuery 解析了。

标签: javascript .net javascriptserializer


【解决方案1】:

虽然您的 success 函数未在给出的其他 AJAX 选项的上下文中显示,但我猜您正在传递“json”的 dataType 选项,或者正在使用 $.getJSON 或类似的东西。

如果是这种情况,jQuery 在将 JSON 传递到 success 时已经为您解析了它,因此您不需要(也不能)再次解析它。您可以简单地使用您的数据结构(data[0]. indiceName 等)。

(下面的代码在http://jaaulde.com/test_bed/GuilhermeLongo/实时运行)

考虑以下 PHP(存储在 json.php 中):

<?php
exit('[{"indiceName":"Caracter","indiciId":24,"indiceId":1,"tamanhoIndice":10,"mask":null,"indiceObr":1},{"indiceName":"Numérico","indiciId":25,"indiceId":2,"tamanhoIndice":10,"mask":null,"indiceObr":0},{"indiceName":"AlfaNumérico","indiciId":26,"indiceId":3,"tamanhoIndice":10,"mask":null,"indiceObr":0}]');

还有下面的JS:

<script src="http://code.jquery.com/jquery.min.js"></script>
<script>
  $.ajax({
    url: 'json.php',
    type: 'get',
    dataType: 'json',
    success: function (data) {
      console.log(data[0]);
      console.log(data[0].indiceName);
    },
    error: function () {
      throw new Error('AJAX request error occurred.');
    }
  });
</script>

它导致以下输出的日志信息:

GET http://jaaulde.com/test_bed/GuilhermeLongo/json.php
    200 OK
    99ms    
    jquery.min.js (line 3)

Object
    {indiceName="Caracter", indiciId=24, indiceId=1, more...}/test_...eLongo/
    (line 8)

Caracter

【讨论】:

  • 这就是问题所在。使用 jquery 完成工作,我将 dataType 设置为 json 并得到上面的字符串。这可以。但是现在当我尝试从解析的数据中获取数据时:console.log(data[0].indiceName) 什么都不返回。我没有索引 id [0]、[1],那么我如何通过 id 捕获 itens?
  • 我不知道您所说的“我没有索引 ID [0]、[1]”是什么意思。您向我们展示的 JSON 是一个充满对象的数组的序列化表示。解析后,您会得到一个自动索引 0-n 的 JS 数组。
  • 上面的相同示例我将 data[0] 设置为:[Object {indiceName="Caracter", indiciId=24, indiceId=1, ...}, Object {indiceName="Numérico" , indiciId=25, indiceId=2, ...}, 对象 {indiceName="AlfaNumérico", indiciId=26, ...}]。不同之处在于,在我的控制器中,我有一个 Json 对象作为 return Json(new { obj }, JsonRequestBehavior.AllowGet);其中 obj 是 c# List
  • JSON 是平台中立的。一旦它在 JSON 中,如果 JS 将其拉入,它就是一个 JS 数组,并且可以像任何其他 JS 数组一样使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
相关资源
最近更新 更多