анализировать ответ json (JavaScriptSerializer) с двойными кавычками, используя jquery - PullRequest
2 голосов
/ 25 февраля 2011

Я использую следующий код в aspx (asp.net MVC ViewPage) для получения сериализованного вывода:

var _accountNames = '<%= ViewData["AccountNames"] != null ? new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ViewData["AccountNames"]) : null%>';

Это дает следующий результат:

[{"Name":"My Saving","AccountBalance":-4.2500,"ReferenceId":2},
{"Name":"My Checking","AccountBalance":0.0000,"ReferenceId":3},
{"Name":"Undeposited Funds","AccountBalance":113.6600,"ReferenceId":2},
{"Name":"Star Account "Trust"","AccountBalance":0.0000,"ReferenceId":50}]

В приведенном выше результате в учетной записи (звездной учетной записи «Доверие») содержатся двойные кавычки. Выдает ошибку "missing } after property list" при использовании eval. Даже использование анализа JSON дает ошибку.

Я использую этот результат для привязки параметров раскрывающегося списка:

 var k = JSON.parse(_accountNames.replace(/'/g, '"'));
 if (k != null && k.length > 0) {
    var options = '';
    options += '<option value="">' + "--Select Account--" + '</option>';
    for (var i = 0; i < k.length; i++) {
       options += '<option value="' + k[i].AccountNameType + '">' + k[i].Name + ' $(' + k[i].AccountBalance + ')' + '</option>';
    }
}
$("select#DepositToddl").html(options);

Как я могу разобрать результат с двойными кавычками? Пожалуйста, предложите.

Ответы [ 2 ]

1 голос
/ 12 марта 2012

Используйте HttpUtility.JavaScriptStringEncode.

Ваш серверный тег станет:

var _accountNames = '<%= ViewData["AccountNames"] != null ? HttpUtility.JavaScriptStringEncode(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ViewData["AccountNames"])) : null%>';
0 голосов
/ 10 июня 2011

Я понимаю, что это старый, но так как Крейг не опубликовал пример ... Я подумал, что сделаю.

Как отмечается в комментарии Крэйга к вашему вопросу, ваш JSON плохой.

Если вы поместите это в LINQPad как оператор C #, вы получите правильно экранированные кавычки:

(вам понадобятся System.Runtime.Serialization и System.Web.Extensions.)

Accounts accounts = new Accounts();
accounts.AccountNames = new List<Account>();
accounts.AccountNames.Add(new Account() { Name = "My Saving", AccountBalance = -4.25, ReferenceId = 2});
accounts.AccountNames.Add(new Account() { Name = "My Checking", AccountBalance = 0, ReferenceId = 3});
accounts.AccountNames.Add(new Account() { Name = "Undeposited Funds", AccountBalance = 113.66, ReferenceId = 2});
accounts.AccountNames.Add(new Account() { Name = "Star Account \"Trust\"", AccountBalance = 0, ReferenceId = 50});

JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
jsonSerializer.Serialize(accounts.AccountNames).Dump();
}

[System.Runtime.Serialization.DataContract]
public class Accounts {
    [System.Runtime.Serialization.DataMember]
    public List<Account> AccountNames { get; set; }
}

[System.Runtime.Serialization.DataContract]
public class Account {
    [System.Runtime.Serialization.DataMember]
    public string Name { get; set; }
    [System.Runtime.Serialization.DataMember]
    public double AccountBalance { get; set; }
    [System.Runtime.Serialization.DataMember]
    public int ReferenceId { get; set; }

Возвращает следующие данные JSON:

[{"Name":"My Saving","AccountBalance":-4.25,"ReferenceId":2},
{"Name":"My Checking","AccountBalance":0,"ReferenceId":3},
{"Name":"Undeposited Funds","AccountBalance":113.66,"ReferenceId":2},
{"Name":"Star Account \"Trust\"","AccountBalance":0,"ReferenceId":50}]

Возможно, вы уже решили эту проблему, но было бы интересно посмотреть, как заполняются ваши ViewData.Это просто строка, созданная на лету, или она действительно основана на объекте?

...