JSON.parse не анализирует строку Json. Сериализация с помощью JavaScriptSerializer

У меня есть сериализованная строка, идущая от контроллера к представлению:

Контроллер:

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, поэтому она должна работать.


person Guilherme Longo    schedule 29.01.2013    source источник
comment
Что вы получаете от console.log(data);? А что, если вы console.log(typeof data);?   -  person Cerbrus    schedule 29.01.2013
comment
Фрагмент под вашей строкой Json выглядит как массив объектов, а не как строка. Много раз jQuery.ajax (который, похоже, вы используете?) будет обрабатывать parse для вас.   -  person jbabey    schedule 29.01.2013
comment
как называется функция успеха?   -  person Philipp    schedule 29.01.2013
comment
@Cerbrus: из данных я получаю приведенную выше строку Json, и typeof говорит, что это объект.   -  person Guilherme Longo    schedule 29.01.2013
comment
Data уже проанализирован jQuery.   -  person dfsq    schedule 29.01.2013
comment
Да, просто попробуйте получить доступ к data[0], он должен вернуть {"indiceName":"Caracter","indiciId":24,"indiceId":1,"tamanhoIndice":10,"mask":null,"indiceObr":1}   -  person Cerbrus    schedule 29.01.2013
comment
@jbabey: кажется, это массив без индекса. Я могу отправить список, который появляется как объект в представлении, но таким образом я не смог получить data.length.   -  person Guilherme Longo    schedule 29.01.2013


Ответы (1)


Хотя ваша функция success не отображается в контексте других заданных параметров AJAX, я предполагаю, что вы передаете параметр dataType "json" или используете $.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
person JAAulde    schedule 29.01.2013
comment
Это проблема. Используя jquery для выполнения задания, я устанавливаю для dataType значение json и получаю приведенную выше строку. Это отлично. Но теперь, когда я пытаюсь получить данные из проанализированных данных: console.log(data[0].indiceName) ничего не возвращает. У меня нет идентификаторов индексов [0], [1], так как я могу захватить их по идентификатору? - person Guilherme Longo; 29.01.2013
comment
Я не знаю, что вы имеете в виду, когда говорите, что у меня нет идентификаторов индексов [0], [1]. JSON, который вы нам показали, представляет собой сериализованное представление массива, полного объектов. При анализе у вас остается массив JS, который автоматически индексируется 0-n. - person JAAulde; 29.01.2013
comment
В том же примере выше у меня данные [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#‹t› - person Guilherme Longo; 29.01.2013
comment
JSON не зависит от платформы. Как только он находится в JSON, если JS извлекает его, это массив JS, который можно использовать так же, как и любой другой массив JS. - person JAAulde; 29.01.2013