Я пытаюсь предупредить, что ценность исходит от 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);
}
Вам не нужно разбирать 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);
}
JSON.parse()
вы можете использовать JSON.parse()
чтобы превратить его в объект.
В основном у вас есть jsonarray, который в свою очередь имеет строку и jsonObject в качестве своих элементов, поэтому сначала посмотрите, есть ли у вас ответ JsonArray с сервера, предупредив его, затем выберите каждый элемент в массиве, например
var jsonArray=response;
alert(jsonArray);//check the response
alert(jsonArray[0]); //first element
затем обработайте элемент jsonObject, как мудрый, чтобы получить к нему доступ
Для проверки правильности ответа json используйте http://jsonlint.com/