Я не уверен, куда я иду неправильно того, что я пропускаю.
Я создаю ASP.NET 2.0 (на платформе.Net 3.5) веб-приложение, и я включаю веб-сервис. Обратите внимание, что это не проект MVC. Я хочу выставить метод, который возвратит строку JSON; отформатированный для питания плагина jqGrid jQuery.
Это - предварительный метод тестирования, который я реализовал в своем сервисе: благодаря (Руководство Phil Haack для MVC)
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string getData()
{
JavaScriptSerializer ser = new JavaScriptSerializer();
var jsonData = new
{
total = 1, // we'll implement later
page = 1,
records = 3, // implement later
rows = new[]{
new {id = 1, cell = new[] {"1", "-7", "Is this a good question?", "yay"}},
new {id = 2, cell = new[] {"2", "15", "Is this a blatant ripoff?", "yay"}},
new {id = 3, cell = new[] {"3", "23", "Why is the sky blue?", "yay"}}
}
};
return ser.Serialize(jsonData); //products.ToString();
}
При вызове это возвращается (отформатированный для ясности):
{
"total":1,
"page":1,
"records":3,
"rows":
[
{"id":1,"cell":["1","-7","Is this a good question?","yay"]},
{"id":2,"cell":["2","15","Is this a blatant ripoff?","yay"]},
{"id":3,"cell":["3","23","Why is the sky blue?","yay"]}
]
}
Как я достиг бы вышеупомянутого ответа без xml переносов?
Эта статья, похоже, использует тот же код:
http://toolmantim.com/articles/bangbang_your_nil_is_dead
в основном, похоже, он просто предназначен для применения оператора не (!) Дважды - по сути принудительно Способ возвращения True или False вместо True, False или Nil.
То есть, если @Current_user
- это nil, вызывая
def logged_in?
@current_user()
end
вернет Nil. Изменение его в (Single Bang)
def logged_in?
!@current_user()
end
вернется истина и меняется дальше (двойной взрыв)
def logged_in?
!!@current_user()
end
, вернет ложь - что более применимо (и пригоднее), чем NIL.
Еще один способ написать это было бы:
def logged_in?
!@current_user().nil?
end
, но это не охватывает дело, когда @Current_user
неверно, и я думаю, что !!
приятнее смотреть на.
«:» - это проведение от сегментированных дней памяти, когда ПК пробежал в реальном режиме и может сделать только 64K одновременно. Номер слева от «:» - это ваш сегмент, номер справа - ваш адрес.
Команда Debug Windows принимает это обозначение, если вы хотите расти в памяти самостоятельно:
C:\Users\Seth> debug
-d0000:7c00
0000:7C00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C10 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C20 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C30 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C40 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C50 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C60 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:7C70 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
Что касается этого конкретного адреса, это просто адрес, который был выбран для загрузки MBR, см.: http: / /www.ata-atapi.com/hiwmbr.html
-121--2771334-" Если найден MBR, он читается в память в местоположении 0000: 7C00 и INT 19 прыжки на память 0000: 7C00 "
Три вещи, которые вы не можете делать:
Может быть способ вызвать метод с получением, я только использовал пост. Я смог получить ваш пример работы с этим:
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script>
// In your javascript block
$(document).ready(function()
{
$.ajax({
url: "/Default.aspx/Tester",
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: "{}",
success: done
});
});
function done(data)
{
// Include http://www.json.org/json2.js if your browser doesn't support JSON natively
var data = JSON.parse(data.d);
alert(data.total);
}
</script>
код позади (вам не нужно создавать веб-сервис, вы можете поставить это по умолчанию .aspx):
[WebMethod]
public static string Tester()
{
JavaScriptSerializer ser = new JavaScriptSerializer();
var jsonData = new
{
total = 1, // we'll implement later
page = 1,
records = 3, // implement later
rows = new[]{
new {id = 1, cell = new[] {"1", "-7", "Is this a good question?", "yay"}},
new {id = 2, cell = new[] {"2", "15", "Is this a blatant ripoff?", "yay"}},
new {id = 3, cell = new[] {"3", "23", "Why is the sky blue?", "yay"}}
}
};
return ser.Serialize(jsonData); //products.ToString();
}
Результат:
{"d":"{\"total\":1,\"page\":1,\"records\":3,\"rows\":[{\"id\":1,\"cell\":[\"1\",\"-7\",\"Is this a good question?\",\"yay\"]},{\"id\":2,\"cell\":[\"2\",\"15\",\"Is this a blatant ripoff?\",\"yay\"]},{\"id\":3,\"cell\":[\"3\",\"23\",\"Why is the sky blue?\",\"yay\"]}]}"}
A больше Подробное объяснение здесь
В вашем коде не «верните» JSON. Используйте вместо этого:
Context.Response.Write (SER.Serialize (JSondata));
Тогда вы будете хорошими.
Команда регулярного возврата помогает вы, поместив более правильный формат обслуживания. Некоторые сказали бы, что это будет лучшая форма, чтобы использовать это, и развернуть свой JSON на клиенте из этого формата. Я говорю, просто выплюните вещи именно, как вы хотите его использовать!
Когда вы отмечаете службу в качестве Scraptservice, он автоматически обрабатывает сериализацию JSON. Вы не должны вручную сериализировать ответ. См. Это Запись переполнения стека для более подробной информации.