Uncaught SyntaxError: неожиданный токен & (Когда я сохранил значение после сериализации объекта) эта ошибка появляется при просмотре

0

Я пытаюсь предупредить, что ценность исходит от Db. Я сохранил это значение, сериализуя его в Javascript. Но когда я пытаюсь предупредить это значение, просмотрите его через ошибку "Uncaught SyntaxError: Неожиданный токен &" Вот значение столбца, помещенного в DB

["TotalCriteria:Total Criteria","{CriteriaID:1,Title:abc,Required:Not Required}","{CriteriaID:2,Title:abc55,Required:Not Required}","{CriteriaID:3,Title:adas,Required:Rquired}","{CriteriaID:5,Title:New,Required:Not Required}","MeetCriteria:Meet","{CriteriaID:1,Title:abc}","{CriteriaID:2,Title:abc55}","{CriteriaID:3,Title:adas}","{CriteriaID:5,Title:New}"]

Я пытаюсь разобрать его. Используя объект JSON в

$(document).ready(function(){
var msg = JSON.parse(@Model.QualifyDetail);
alert(msg);
});

Изменить (BackendCode)

CModel.QualifyDetail = JsonString(entities);
    public string JsonString(Entity[] entities)
    {
        List<object> list = new List<object>();
        list.Add("TotalCriteria:Total Criteria");
        string requiredStatus = null;
        int CROID = new VM_CROEmployee().FindById(VM_User2.LoggedInUserID()).CROID;
        List<VM_QualifyCriteria> Criteria = new VM_QualifyCriteria().FindAllByAttributes(c => c.CROID == CROID);

        foreach(VM_QualifyCriteria obj in Criteria)
        {
            if (obj.IsRequired == true)
                requiredStatus = "Rquired";
            else
                requiredStatus = "Not Required";
            list.Add("{CriteriaID:" + obj.CriteriaID + ",Title:" + obj.Title + ",Required:" + requiredStatus + "}");
        }
        list.Add("MeetCriteria:Meet");
        foreach(Entity obj in entities)
        {
            if (obj.State == true)
            {
                list.Add("{CriteriaID:" + new VM_QualifyCriteria().FindById(obj.CriteriaId).CriteriaID +",Title:"+new VM_QualifyCriteria().FindById(obj.CriteriaId).Title+"}");
            }
        }
        //string qualifyDescription=new JavaScriptSerializer().Serialize(list);
        return new JavaScriptSerializer().Serialize(list); 
    }
  • 0
    Неверный JSON ..!
  • 0
    Не могли бы вы показать мне отрендеренный скрипт с актуальным значением вместо model.qualifydetail
Показать ещё 2 комментария
Теги:
asp.net-mvc

2 ответа

3
Лучший ответ

Вам не нужно разбирать JSON, просто выведите JSON в скрипт. msg уже будет массивом JavaScript, поэтому нет необходимости снова его анализировать.

(Используйте HtmlHelper.Raw() иначе кавычки будут закодированы в HTML)

$(document).ready(function(){
    var msg = @Html.Raw(Model.QualifyDetail);
    alert(msg[0]);
});

Это будет выводиться (JSON отформатирован для чтения):

$(document).ready(function(){
    var msg = [
        "TotalCriteria:Total Criteria",
        "{CriteriaID:1,Title:abc,Required:Not Required}",
        "{CriteriaID:2,Title:abc55,Required:Not Required}",
        "{CriteriaID:3,Title:adas,Required:Rquired}",
        "{CriteriaID:5,Title:New,Required:Not Required}",
        "MeetCriteria:Meet",
        "{CriteriaID:1,Title:abc}",
        "{CriteriaID:2,Title:abc55}",
        "{CriteriaID:3,Title:adas}",
        "{CriteriaID:5,Title:New}"
    ];
    alert(msg[0]);  // should alert "TotalCriteria:Total Criteria"
});

Как уже упоминалось другими, хотя это справедливо JSON (это массив строк), он, по-видимому, представляет собой более сложную структуру данных, но во время сериализации он искажается. Вероятно, вам придется исправить это, прежде чем вы сможете его использовать.

редактировать

Лучшим способом представления данных может быть объект с двумя массивами, один со всеми критериями и один с критериями, которые были выполнены. Что-то вроде этого:

{
    "TotalCriteria": [
        {
            "CriteriaID": 1,
            "Title": "abc",
            "Required": "Not Required"
        },
        {
            "CriteriaID": 2,
            "Title": "abc55",
            "Required": "Not Required"
        },
        {
            "CriteriaID": 3,
            "Title": "adas",
            "Required": "Required"
        },
        {
            "CriteriaID": 5,
            "Title": "New",
            "Required": "Not Required"
        }
    ],
    "MeetCriteria": [
        {
            "CriteriaID": 1,
            "Title": "abc"
        },
        {
            "CriteriaID": 2,
            "Title": "abc55"
        },
        {
            "CriteriaID": 3,
            "Title": "adas"
        },
        {
            "CriteriaID": 5,
            "Title": "New"
        }
    ]
}

Чтобы получить доступ к критериям, вы сделаете это...

var msg0 = msg.TotalCriteria[0];
alert(msg0.CriteriaID);
alert(msg0.Title);
alert(msg0.Required);

Вот как вы можете сконструировать вышеуказанный JSON в своем backend-коде, используя LINQ, чтобы создать объект, содержащий два списка объектов, а затем сериализуя его...

public string JsonString(Entity[] entities)
{
    int CROID = new VM_CROEmployee().FindById(VM_User2.LoggedInUserID()).CROID;
    List<VM_QualifyCriteria> criteria = new VM_QualifyCriteria().FindAllByAttributes(c => c.CROID == CROID);

    // get a list of all criteria
    var totalCriteria = criteria.Select(c => new {
        c.CriteriaID,
        c.Title,
        Required = c.IsRequired ? "Required" : "Not Required"
    }).ToList();

    // get list of criteria met
    var meetCriteria = criteria
                        .Where(c => entities.Any(e => e.State == true && e.CriteriaId == c.CriteriaID))
                        .Select(c => new {
                            c.CriteriaID,
                            c.Title
                        }).ToList();

    // construct object with the 2 lists
    var obj = new { TotalCriteria = totalCriteria, MeetCriteria = meetCriteria };

    return new JavaScriptSerializer().Serialize(obj); 
}
  • 0
    Да @ Энтони, вы правы (у), когда я пытаюсь это сделать, все работает нормально. Скажите, пожалуйста, как я могу получить доступ к массиву, когда я пытаюсь получить сообщение [1]: «CriteriaID: 1, Название: abc, Требуется: Не требуется} "Возможно ли получить доступ к CriteriaID в этом конкретном массиве, так же необходим заголовок и требуемый.
  • 0
    Обновлен ответ: JSON.parse() вы можете использовать JSON.parse() чтобы превратить его в объект.
Показать ещё 8 комментариев
0

В основном у вас есть jsonarray, который в свою очередь имеет строку и jsonObject в качестве своих элементов, поэтому сначала посмотрите, есть ли у вас ответ JsonArray с сервера, предупредив его, затем выберите каждый элемент в массиве, например

var jsonArray=response;
alert(jsonArray);//check the response
alert(jsonArray[0]); //first element

затем обработайте элемент jsonObject, как мудрый, чтобы получить к нему доступ

Для проверки правильности ответа json используйте http://jsonlint.com/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню