JSON

Поделись знанием:
Перейти к: навигация, поиск
JSON
Тип формата

Data interchange

Стандарт(ы)

RFC 7159

JSON (англ. JavaScript Object Notation, обычно произносится как /ˈsən/[1]) — текстовый формат обмена данными, основанный на JavaScript. Как и многие другие текстовые форматы, JSON легко читается людьми. Формат JSON был разработан Дугласом Крокфордом[2].

Несмотря на происхождение от JavaScript (точнее, от подмножества языка стандарта ECMA-262 1999 года), формат считается независимым от языка и может использоваться практически с любым языком программирования. Для многих языков существует готовый код для создания и обработки данных в формате JSON.





Использование

За счёт своей лаконичности по сравнению с XML, формат JSON может быть более подходящим для сериализации сложных структур. Если говорить о веб-приложениях, в таком ключе он уместен в задачах обмена данными как между браузером и сервером (AJAX), так и между самими серверами (программные HTTP-сопряжения).

Поскольку формат JSON является подмножеством синтаксиса языка JavaScript, то он может быть быстро десериализован встроенной функцией eval(). Кроме того, возможна вставка вполне работоспособных JavaScript-функций. В языке PHP, начиная с версии 5.2.0, поддержка JSON включена в ядро в виде функций json_decode() и json_encode(), которые сами преобразуют типы данных JSON в соответствующие типы PHP и наоборот.

Синтаксис

JSON-текст представляет собой (в закодированном виде) одну из двух структур:

Это универсальные структуры данных: как правило, любой современный язык программирования поддерживает их в той или иной форме. Они легли в основу JSON, так как он используется для обмена данными между различными языками программирования.

В качестве значений в JSON могут быть использованы:

  • Объект — это неупорядоченное множество пар ключ:значение, заключённое в фигурные скобки «{ }». Ключ описывается строкой, между ним и значением стоит символ «:». Пары ключ-значение отделяются друг от друга запятыми.
  • Массив (одномерный) — это упорядоченное множество значений. Массив заключается в квадратные скобки «[ ]». Значения разделяются запятыми.
  • Число.
  • Литералы true, false и null.
  • Строка — это упорядоченное множество из нуля или более символов юникода, заключенное в двойные кавычки. Символы могут быть указаны с использованием escape-последовательностей, начинающихся с обратной косой черты «\» (поддерживаются варианты \", \\, \/, \t, \n, \r, \f и \b), или записаны шестнадцатеричным кодом в кодировке UTF-8 в виде \uFFFF.

Строка очень похожа на одноимённый тип данных в языках С и Java. Число тоже очень похоже на С- или Java-число, за исключением того, что используется только десятичный формат. Пробелы могут быть вставлены между любыми двумя синтаксическими элементами.

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

{
   "firstName": "Иван",
   "lastName": "Иванов",
   "address": {
       "streetAddress": "Московское ш., 101, кв.101",
       "city": "Ленинград",
       "postalCode": 101101
   },
   "phoneNumbers": [
       "812 123-1234",
       "916 123-4567"
   ]
}

На языке XML подобная структура выглядела бы примерно так:

<person>
  <firstName>Иван</firstName>
  <lastName>Иванов</lastName>
  <address>
    <streetAddress>Московское ш., 101, кв.101</streetAddress>
    <city>Ленинград</city>
    <postalCode>101101</postalCode>
  </address>
  <phoneNumbers>
    <phoneNumber>812 123-1234</phoneNumber>
    <phoneNumber>916 123-4567</phoneNumber>
  </phoneNumbers>
</person>

или так:

<person firstName="Иван" lastName="Иванов">
  <address streetAddress="Московское ш., 101, кв.101" city="Ленинград" postalCode="101101" />
  <phoneNumbers>
    <phoneNumber>812 123-1234</phoneNumber>
    <phoneNumber>916 123-4567</phoneNumber>
  </phoneNumbers>
</person>

JSON5

JSON5 — предложенное расширение формата json в соответствии с синтаксисом ECMAScript 5, вызванное тем, что json используется не только для общения между программами, но и создается/редактируется вручную[4]. JSON5 является корректным кодом ECMAScript 5. Для некоторых языков программирования уже существуют парсеры json5.

Некоторые нововведения:

  • Поддерживаются как однострочные //, так и многострочные /* */ комментарии.
  • Объекты и списки могут иметь запятую после последнего элемента (удобно при копипейсте элементов).
  • Ключи объекта могут быть без кавычек, если они являются валидными идентификаторами ECMAScript 5.
  • Строки могут заключаться как в одинарные, так и в двойные кавычки.
  • Числа могут быть в шестнадцатеричном виде, начинаться или заканчиваться десятичной точкой, включать Infinity, -Infinity, NaN и -NaN, начинаться со знака +.

Сравнение с YAML

Как функционально, так и синтаксически JSON является подмножеством языка YAML. В частности, спецификация YAML 1.2 указывает, что «любой файл в формате JSON является корректным файлом в формате YAML»[5]. Наиболее распространённый парсер YAML способен обрабатывать и JSON[6]. Спецификация YAML до версии 1.2 не полностью покрывала JSON, в первую очередь из-за отсутствия родной поддержки UTF-32 в YAML, а также требования пробела после разделителя-запятой; кроме того, спецификация JSON включала комментарии в стиле /* */.

Наиболее важным отличием YAML является набор расширений синтаксиса, которым нет аналогов в JSON:

  • поддержка реляционных данных: в YAML-документе можно ссылаться на якорь, встретившийся ранее в файле/потоке; таким образом можно выразить рекурсивные структуры.
  • поддержка расширяемых типов данных помимо примитивов: строк, чисел, логических значений и т.д.
  • поддержка блочного синтаксиса с отступами; он позволяет описать структурированные данные без использования лишних символов: всевозможных скобок, кавычек и т.д.

JSON Schema

JSON Schema — один из языков описания структуры JSON-документа. Использует синтаксис JSON. Базируется на концепциях XML Schema, RelaxNG, Kwalify. JSON Schema — самоописательный язык: при его использовании для обработки данных и описания их допустимости могут использоваться одни и те же инструменты сериализации/десериализации[7].

Использование JSON в Ajax

Следующий пример Javascript-кода показывает, как браузер может использовать XMLHttpRequest, чтобы запрашивать с сервера объект в формате JSON (серверная часть программы опущена; в ней должен быть размещён код, отправляющий данные в формате JSON-строки в ответ на запросы по url).

var http_request = new XMLHttpRequest();
http_request.onreadystatechange = function () {
    if(http_request.readyState !== 4)
        return;
        
    if(http_request.status !== 200 )
        throw new Error('request was defeated')
        
    do_something_with_object(JSON.parse(http_request.responseText));
    http_request = null;
};
http_request.open( "GET", url, true );
http_request.send(null);

Заметим, что данный пример применения XMLHttpRequest не поддерживает Internet Explorer до версии 6 включительно, так что для них следует использовать несколько иной код. Возможности применения XMLHttpRequest ограничены из-за правила ограничения домена (same origin policy): URL ответ на запрос должен находиться в том же DNS домене, что и сервер, на котором находится страница, запрашивающая ответ. В качестве альтернативы применяется подход JSONP, включающий в себя использование закодированного вызова функции, передающегося между клиентом и сервером, чтобы клиент мог загружать закодированные в JSON данные со сторонних доменов, и уведомлять о завершении вызывающую сторону, хотя это приводит к некоторым рискам для безопасности и дополнительным требованиям к серверу.

Как вариант, в коде страницы можно использовать элементы <iframe> для асинхронного запроса JSON данных, или просто <form action="url_to_cgi_script"> . Эти подходы были распространены до появления широкой поддержки XMLHttpRequest.

Также можно использовать для передачи JSON-данных динамические теги <script>. С помощью этого метода можно обойти правило ограничения домена (same origin policy), но он приводит к появлению уязвимого кода. В качестве более безопасной альтернативы было предложено использовать [json.org/JSONRequest.html JSONRequest].

Вопросы безопасности

Хотя JSON предназначен для передачи данных в сериализованном виде, его синтаксис соответствует синтаксису JavaScript и это создает ряд проблем безопасности. Зачастую для обработки данных, полученных от внешнего источника в формате JSON, к ним применяется функция eval() без какой-либо предварительной проверки.

JavaScript eval()

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

Техника использования eval() делает систему уязвимой, если источник используемых JSON-данных не является доверенным (англ.). В качестве таких данных может выступать вредоносный JavaScript код для атак класса Внедрение кода (англ.). С помощью данной уязвимости возможно осуществлять кражу данных, подделку аутентификации. Тем не менее, уязвимость можно устранить за счёт использования дополнительных средств проверки данных на корректность. Например, до выполнения eval() полученные от внешнего источника данные могут проверяться с помощью регулярных выражений. В RFC, определяющей JSON[8], предлагается использовать следующий код для проверки его соответствия формату JSON

var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
text.replace(/"(\\.|[^"\\])*"/g, ''))) &&
eval('(' + text + ')');

Как более безопасная альтернатива eval() была предложена новая функция JSON.parse(), способная обрабатывать только JSON-данные. Она была представлена в четвёртой версии стандарта ECMAScript и описана в статье «JSON: Обезжиренная альтернатива XML»[9]. В настоящее время она доступна как библиотека JavaScript[10] и была включена в пятую редакцию ECMAScript.

Встроенный JSON

Последние версии веб-браузеров имеют встроенную поддержку JSON и способны его обрабатывать без вызова функции eval(), приводящей к описанной проблеме. Обработка JSON в таком случае обычно осуществляется быстрее. Так в июне 2009 года следующие браузеры имели встроенную поддержку JSON:

По крайней мере, пять популярных библиотек JavaScript используют встроенный JSON, в случае его доступности:

Подделка кроссдоменного запроса

Непродуманное использование JSON делает сайты уязвимыми к подделке межсайтовых запросов (CSRF или XSRF)[21]. Поскольку тег <script> допускает использование источника, не принадлежащего к тому же домену, что и использующий ресурс, это позволяет выполнять код под видом данных, представленных в формате JSON, в контексте произвольной страницы, что делает возможным компрометацию паролей или другой конфиденциальной информации пользователей, прошедших авторизацию на другом сайте.

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

JSONP и JSONPP

JSONP (англ. JSON Padding — «JSON с подкладкой») является расширением JSON, когда имя функции обратного вызова указывается в качестве входного аргумента.

В основу технологии положен тот факт, что политика безопасности браузера не запрещает использовать тег <script type="text/javascript" src="…"></script> для обращения к серверам, отличным от сервера, с которого произошла загрузка страницы.

Без использования технологии JSONP (то есть используя просто JSON кодирование данных) сервер может вернуть только данные. Например, так:

{"paper": "A4", "count": 5}

Однако это только данные, и они не могут влиять на браузер.

Используя технику JSONP, стороннему серверу передается в строке вызова (GET) имя callback функции:

<script type="text/javascript" src="example.com/getjson?jsonp=parseResponse"></script>

Здесь параметр jsonp содержит имя callback функции parseResponse.

Теперь посторонний сервер example.com может вернуть следующий код:

parseResponse({"paper": "A4", "count": 5})

Теперь код вызывает javascript-функцию первого домена.

Первоначально идея была предложена в блоге MacPython в 2005 году[22] и в настоящее время используется многими Web 2.0 приложениями, такими, как Dojo Toolkit Applications, Google Toolkit Applications [www.gwtapps.com/?p=42] и zanox Web Services. Дальнейшие расширения этого протокола были предложены с учетом ввода дополнительных аргументов, как, например, в случае JSONPP[23] при поддержке S3DB веб-сервисов.

Поскольку JSONP использует скрипт теги, вызовы по сути открыты миру. По этой причине JSONP может быть неуместными для хранения конфиденциальных данных[24].

Включение скриптовых тегов от удаленных сайтов позволяет им передать любой контент на сайте. Если удаленный сайт имеет уязвимости, которые позволяют выполнить Javascript инъекции, то исходный сайт также может быть затронут ими.

JSONPP (англ. parameterized JSON with padding — «параметризованный JSON с подкладкой») — развитие идеи JSONP.

JSONPP включает в себя URL источника, имя функции, которая будет обрабатывать JSON данные, строка для eval после получения данных и строка для eval после окончания обработки данных:

JSON_call(SRC,JSONP,JSONPP,ONLOAD);
в итоге оборачивается
ans = JSONP(SRC)
{
    eval(JSONPP(ans));
    eval(ONLOAD);
}

Вообще, для самой идеи JSONPP не принципиально количество параметров. Достаточно SRC, JSONP, JSONPP (и их обработка на стороне сервера, а затем клиента) для того, чтобы это был JSONPP.

Рассмотрим на примере работы с сервисом S3DB.

function s3db_jsonpp_call(src, next_eval){
	var call = "call_"+Math.random().toString().replace(/\./g,"");
	var headID = document.getElementsByTagName("head")[0];
	var script = document.createElement('script');
	script.id = call;
	script.type = 'text/javascript';
	// using padded, parameterized json
	src = src+"&format=json&jsonp=s3db_jsonpp&jsonpp="+next_eval+"&onload=remove_element_by_id('"+script.id+"')";
	script.src = src;
	headID.appendChild(script); // retrieve answer
}
function s3db_jsonpp(ans, jsonpp){
	eval(jsonpp);
	return ans;
}
function remove_element_by_id(id){
	var e = document.getElementById(id);
	e.parentNode.removeChild(e);
	return false;
}

В примере функция s3db_jsonpp_call() создаёт в DOM в части head элемент script, src которого соответствует вызову JSONPP.

После получения ответа от сервера будет вызвана s3db_jsonpp() — она передана в параметрах вызова, как это должно быть по правилам JSONP.

Внутри s3db_jsonpp() сработает eval(jsonpp), и произойдёт возврат значения ans.

Вызов eval(onload) приводит к выполнению remove_element_by_id() с id созданного скрипта в head и в итоге к его удалению, ведь он уже всё равно не будет использоваться, поскольку id в примере было сгенерировано случайным образом в самом начале функции s3db_jsonpp_call(). Этот вызов в ответе сервера.

Напишите отзыв о статье "JSON"

Ссылки на объекты

Стандарт JSON не поддерживает ссылки на объекты, однако, Dojo Toolkit демонстрирует, как при помощи дополнительных соглашений можно обеспечить поддержку таких ссылок средствами стандартного JSON. В частности, модуль [dojotoolkit.org/api/dojox/json/ref.html dojox.json.ref] предоставляет поддержку нескольких форм ссылок, включая круговые, множественные, междокументные и «ленивые» ссылки[25].

См. также

Примечания

  1. [www.youtube.com/watch?v=hQVTIJBZook&t=2405 Doug Crockford "Google Tech Talks: JavaScript: The Good Parts"] (7 February 2009).
  2. [www.tbray.org/ongoing/When/201x/2014/03/05/RFC7159-JSON JSON Redux AKA RFC7159].
  3. jsonrpc.org/historical/json-rpc-1-1-alt.html#service-procedure-and-parameter-names
  4. [json5.org/ JSON5 by aseemk]
  5. [yaml.org/spec/1.2/#id2560236 YAML Ain’t Markup Language (YAML™) Version 1.2] (англ.)(недоступная ссылка — история). — Working Draft 2008-05-11. Проверено 24 сентября 2009. [web.archive.org/20080516232502/yaml.org/spec/1.2/#id2560236 Архивировано из первоисточника 16 мая 2008].
  6. [viewsourcecode.org/why/redhanded/inspect/yamlIsJson.html YAML is JSON]. RedHanded (07 апреля 2005). Проверено 25 сентября 2012..
  7. Json.Com. [www.json.com/json-schema-proposal/ JSON Schema Proposal] (англ.)(недоступная ссылка — история). [web.archive.org/20080514105937/www.json.com/json-schema-proposal/ Архивировано из первоисточника 14 мая 2008].
  8. RFC 4627 (Request for Comments)
  9. [www.json.org/fatfree.html JSON: Обезжиренная альтернатива XML] (англ.). [www.webcitation.org/65OHt7Ehp Архивировано из первоисточника 12 февраля 2012].
  10. [www.JSON.org/json2.js json2.js] (англ.). Проверено 24 сентября 2009. [www.webcitation.org/65OHtd8Qw Архивировано из первоисточника 12 февраля 2012].
  11. [developer.mozilla.org/en/Using_JSON_in_Firefox Использование встроенного JSON] (англ.).
  12. [blogs.msdn.com/ie/archive/2008/09/10/native-json-in-ie8.aspx Встроенный JSON в IE8] (англ.). [www.webcitation.org/65OHu3fNT Архивировано из первоисточника 12 февраля 2012].
  13. [www.opera.com/docs/specs/presto25/#ecmascript Web спецификации, поддерживаемые в Opera Presto 2.5] (англ.) (March 10, 2010). Проверено 29 марта 2010. [www.webcitation.org/65OHuxQxY Архивировано из первоисточника 12 февраля 2012].
  14. [bugs.webkit.org/show_bug.cgi?id=20031 Реализация ES 3.1 объекта JSON] (англ.).
  15. [dev.jquery.com/ticket/4429 Ticket #4429lang=en]. [www.webcitation.org/65OHvbo7T Архивировано из первоисточника 12 февраля 2012].
  16. [dev.jquery.com/ticket/4429 Ticket #4429] (May 22, 2009). Проверено 3 июля 2009. [www.webcitation.org/65OHvbo7T Архивировано из первоисточника 12 февраля 2012].
  17. [trac.dojotoolkit.org/ticket/8111 Ticket #8111lang=en]. [www.webcitation.org/65OHwBP9o Архивировано из первоисточника 12 февраля 2012].
  18. [mootools.net/blog/2011/02/25/mootools-core-more-1-3-1/ MooTools Core & More 1.3.1]. [www.webcitation.org/65OHwoDLb Архивировано из первоисточника 12 февраля 2012].
  19. [developer.yahoo.com/yui/json/#native YUI 2: JSON utility] (September 1, 2009). Проверено 22 октября 2009. [www.webcitation.org/65OHxSxOd Архивировано из первоисточника 12 февраля 2012].
  20. [www.prototypejs.org/learn/json Learn JSON] (April 7, 2010). Проверено 7 апреля 2010. [www.webcitation.org/65OHy51Yi Архивировано из первоисточника 12 февраля 2012].
  21. Джереми Гроссмэн. [jeremiahgrossman.blogspot.com/2006/01/advanced-web-attack-techniques-using.html Продвинутые техники атак на веб-приложения, использующие GMail] (англ.). WhiteHat Security. Проверено 23 сентября 2009. [www.webcitation.org/65OHyb8Xy Архивировано из первоисточника 12 февраля 2012].
  22. [bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/ from __future__ import * » Remote JSON - JSONP]. Bob.pythonmac.org. Проверено 8 сентября 2008. [www.webcitation.org/65OHzF7n5 Архивировано из первоисточника 12 февраля 2012].
  23. Almeida, Jonas (June 11, 2008). «[sites.google.com/a/s3db.org/s3db/documentation/mis/json-jsonp-jsonpp JSON, JSONP, JSONPP?]» (S3DB). Проверено 2009-04-26.
  24. RIAspot. [www.riaspot.com/blogs/entry/JSONP-for-Cross-Site-XHR JSON P for Cross Site XHR](недоступная ссылка — история). [web.archive.org/20081205002754/www.riaspot.com/blogs/entry/JSONP-for-Cross-Site-XHR Архивировано из первоисточника 5 декабря 2008].
  25. [www.sitepen.com/blog/2008/06/17/json-referencing-in-dojo JSON referencing in Dojo]. [www.webcitation.org/65OHznKVp Архивировано из первоисточника 12 февраля 2012].

Напишите отзыв о статье "JSON"

Ссылки

  • [json.org/json-ru.html Официальная домашняя страница формата на русском языке]
  • [json.org/json.js json.js], [json.org/json2.js json2.js] — библиотека, разработанная Дугласом Крокфордом, для работы с данными JSON в JavaScript. Расширяет объект Object методом toJSONString, который затем присутствует в любом объекте, и осуществляет его преобразование в строку формата JSON.
  • [json-rpc.org/ json-rpc.org]  (англ.)
  • [learn.javascript.ru/json Глава о JSON из онлайн учебника JavaScript]  (рус.)

Отрывок, характеризующий JSON

– Ну, это еще недостаточная причина, маменька.
– Ах, Боже мой! Боже мой! Как он плох! – восклицала мать.


Когда Анна Михайловна уехала с сыном к графу Кириллу Владимировичу Безухому, графиня Ростова долго сидела одна, прикладывая платок к глазам. Наконец, она позвонила.
– Что вы, милая, – сказала она сердито девушке, которая заставила себя ждать несколько минут. – Не хотите служить, что ли? Так я вам найду место.
Графиня была расстроена горем и унизительною бедностью своей подруги и поэтому была не в духе, что выражалось у нее всегда наименованием горничной «милая» и «вы».
– Виновата с, – сказала горничная.
– Попросите ко мне графа.
Граф, переваливаясь, подошел к жене с несколько виноватым видом, как и всегда.
– Ну, графинюшка! Какое saute au madere [сотэ на мадере] из рябчиков будет, ma chere! Я попробовал; не даром я за Тараску тысячу рублей дал. Стоит!
Он сел подле жены, облокотив молодецки руки на колена и взъерошивая седые волосы.
– Что прикажете, графинюшка?
– Вот что, мой друг, – что это у тебя запачкано здесь? – сказала она, указывая на жилет. – Это сотэ, верно, – прибавила она улыбаясь. – Вот что, граф: мне денег нужно.
Лицо ее стало печально.
– Ах, графинюшка!…
И граф засуетился, доставая бумажник.
– Мне много надо, граф, мне пятьсот рублей надо.
И она, достав батистовый платок, терла им жилет мужа.
– Сейчас, сейчас. Эй, кто там? – крикнул он таким голосом, каким кричат только люди, уверенные, что те, кого они кличут, стремглав бросятся на их зов. – Послать ко мне Митеньку!
Митенька, тот дворянский сын, воспитанный у графа, который теперь заведывал всеми его делами, тихими шагами вошел в комнату.
– Вот что, мой милый, – сказал граф вошедшему почтительному молодому человеку. – Принеси ты мне… – он задумался. – Да, 700 рублей, да. Да смотри, таких рваных и грязных, как тот раз, не приноси, а хороших, для графини.
– Да, Митенька, пожалуйста, чтоб чистенькие, – сказала графиня, грустно вздыхая.
– Ваше сиятельство, когда прикажете доставить? – сказал Митенька. – Изволите знать, что… Впрочем, не извольте беспокоиться, – прибавил он, заметив, как граф уже начал тяжело и часто дышать, что всегда было признаком начинавшегося гнева. – Я было и запамятовал… Сию минуту прикажете доставить?
– Да, да, то то, принеси. Вот графине отдай.
– Экое золото у меня этот Митенька, – прибавил граф улыбаясь, когда молодой человек вышел. – Нет того, чтобы нельзя. Я же этого терпеть не могу. Всё можно.
– Ах, деньги, граф, деньги, сколько от них горя на свете! – сказала графиня. – А эти деньги мне очень нужны.
– Вы, графинюшка, мотовка известная, – проговорил граф и, поцеловав у жены руку, ушел опять в кабинет.
Когда Анна Михайловна вернулась опять от Безухого, у графини лежали уже деньги, всё новенькими бумажками, под платком на столике, и Анна Михайловна заметила, что графиня чем то растревожена.
– Ну, что, мой друг? – спросила графиня.
– Ах, в каком он ужасном положении! Его узнать нельзя, он так плох, так плох; я минутку побыла и двух слов не сказала…
– Annette, ради Бога, не откажи мне, – сказала вдруг графиня, краснея, что так странно было при ее немолодом, худом и важном лице, доставая из под платка деньги.
Анна Михайловна мгновенно поняла, в чем дело, и уж нагнулась, чтобы в должную минуту ловко обнять графиню.
– Вот Борису от меня, на шитье мундира…
Анна Михайловна уж обнимала ее и плакала. Графиня плакала тоже. Плакали они о том, что они дружны; и о том, что они добры; и о том, что они, подруги молодости, заняты таким низким предметом – деньгами; и о том, что молодость их прошла… Но слезы обеих были приятны…


Графиня Ростова с дочерьми и уже с большим числом гостей сидела в гостиной. Граф провел гостей мужчин в кабинет, предлагая им свою охотницкую коллекцию турецких трубок. Изредка он выходил и спрашивал: не приехала ли? Ждали Марью Дмитриевну Ахросимову, прозванную в обществе le terrible dragon, [страшный дракон,] даму знаменитую не богатством, не почестями, но прямотой ума и откровенною простотой обращения. Марью Дмитриевну знала царская фамилия, знала вся Москва и весь Петербург, и оба города, удивляясь ей, втихомолку посмеивались над ее грубостью, рассказывали про нее анекдоты; тем не менее все без исключения уважали и боялись ее.
В кабинете, полном дыма, шел разговор о войне, которая была объявлена манифестом, о наборе. Манифеста еще никто не читал, но все знали о его появлении. Граф сидел на отоманке между двумя курившими и разговаривавшими соседями. Граф сам не курил и не говорил, а наклоняя голову, то на один бок, то на другой, с видимым удовольствием смотрел на куривших и слушал разговор двух соседей своих, которых он стравил между собой.
Один из говоривших был штатский, с морщинистым, желчным и бритым худым лицом, человек, уже приближавшийся к старости, хотя и одетый, как самый модный молодой человек; он сидел с ногами на отоманке с видом домашнего человека и, сбоку запустив себе далеко в рот янтарь, порывисто втягивал дым и жмурился. Это был старый холостяк Шиншин, двоюродный брат графини, злой язык, как про него говорили в московских гостиных. Он, казалось, снисходил до своего собеседника. Другой, свежий, розовый, гвардейский офицер, безупречно вымытый, застегнутый и причесанный, держал янтарь у середины рта и розовыми губами слегка вытягивал дымок, выпуская его колечками из красивого рта. Это был тот поручик Берг, офицер Семеновского полка, с которым Борис ехал вместе в полк и которым Наташа дразнила Веру, старшую графиню, называя Берга ее женихом. Граф сидел между ними и внимательно слушал. Самое приятное для графа занятие, за исключением игры в бостон, которую он очень любил, было положение слушающего, особенно когда ему удавалось стравить двух говорливых собеседников.
– Ну, как же, батюшка, mon tres honorable [почтеннейший] Альфонс Карлыч, – говорил Шиншин, посмеиваясь и соединяя (в чем и состояла особенность его речи) самые народные русские выражения с изысканными французскими фразами. – Vous comptez vous faire des rentes sur l'etat, [Вы рассчитываете иметь доход с казны,] с роты доходец получать хотите?
– Нет с, Петр Николаич, я только желаю показать, что в кавалерии выгод гораздо меньше против пехоты. Вот теперь сообразите, Петр Николаич, мое положение…
Берг говорил всегда очень точно, спокойно и учтиво. Разговор его всегда касался только его одного; он всегда спокойно молчал, пока говорили о чем нибудь, не имеющем прямого к нему отношения. И молчать таким образом он мог несколько часов, не испытывая и не производя в других ни малейшего замешательства. Но как скоро разговор касался его лично, он начинал говорить пространно и с видимым удовольствием.
– Сообразите мое положение, Петр Николаич: будь я в кавалерии, я бы получал не более двухсот рублей в треть, даже и в чине поручика; а теперь я получаю двести тридцать, – говорил он с радостною, приятною улыбкой, оглядывая Шиншина и графа, как будто для него было очевидно, что его успех всегда будет составлять главную цель желаний всех остальных людей.
– Кроме того, Петр Николаич, перейдя в гвардию, я на виду, – продолжал Берг, – и вакансии в гвардейской пехоте гораздо чаще. Потом, сами сообразите, как я мог устроиться из двухсот тридцати рублей. А я откладываю и еще отцу посылаю, – продолжал он, пуская колечко.
– La balance у est… [Баланс установлен…] Немец на обухе молотит хлебец, comme dit le рroverbe, [как говорит пословица,] – перекладывая янтарь на другую сторону ртa, сказал Шиншин и подмигнул графу.
Граф расхохотался. Другие гости, видя, что Шиншин ведет разговор, подошли послушать. Берг, не замечая ни насмешки, ни равнодушия, продолжал рассказывать о том, как переводом в гвардию он уже выиграл чин перед своими товарищами по корпусу, как в военное время ротного командира могут убить, и он, оставшись старшим в роте, может очень легко быть ротным, и как в полку все любят его, и как его папенька им доволен. Берг, видимо, наслаждался, рассказывая всё это, и, казалось, не подозревал того, что у других людей могли быть тоже свои интересы. Но всё, что он рассказывал, было так мило степенно, наивность молодого эгоизма его была так очевидна, что он обезоруживал своих слушателей.
– Ну, батюшка, вы и в пехоте, и в кавалерии, везде пойдете в ход; это я вам предрекаю, – сказал Шиншин, трепля его по плечу и спуская ноги с отоманки.
Берг радостно улыбнулся. Граф, а за ним и гости вышли в гостиную.

Было то время перед званым обедом, когда собравшиеся гости не начинают длинного разговора в ожидании призыва к закуске, а вместе с тем считают необходимым шевелиться и не молчать, чтобы показать, что они нисколько не нетерпеливы сесть за стол. Хозяева поглядывают на дверь и изредка переглядываются между собой. Гости по этим взглядам стараются догадаться, кого или чего еще ждут: важного опоздавшего родственника или кушанья, которое еще не поспело.
Пьер приехал перед самым обедом и неловко сидел посредине гостиной на первом попавшемся кресле, загородив всем дорогу. Графиня хотела заставить его говорить, но он наивно смотрел в очки вокруг себя, как бы отыскивая кого то, и односложно отвечал на все вопросы графини. Он был стеснителен и один не замечал этого. Большая часть гостей, знавшая его историю с медведем, любопытно смотрели на этого большого толстого и смирного человека, недоумевая, как мог такой увалень и скромник сделать такую штуку с квартальным.
– Вы недавно приехали? – спрашивала у него графиня.
– Oui, madame, [Да, сударыня,] – отвечал он, оглядываясь.
– Вы не видали моего мужа?
– Non, madame. [Нет, сударыня.] – Он улыбнулся совсем некстати.
– Вы, кажется, недавно были в Париже? Я думаю, очень интересно.
– Очень интересно..
Графиня переглянулась с Анной Михайловной. Анна Михайловна поняла, что ее просят занять этого молодого человека, и, подсев к нему, начала говорить об отце; но так же, как и графине, он отвечал ей только односложными словами. Гости были все заняты между собой. Les Razoumovsky… ca a ete charmant… Vous etes bien bonne… La comtesse Apraksine… [Разумовские… Это было восхитительно… Вы очень добры… Графиня Апраксина…] слышалось со всех сторон. Графиня встала и пошла в залу.
– Марья Дмитриевна? – послышался ее голос из залы.
– Она самая, – послышался в ответ грубый женский голос, и вслед за тем вошла в комнату Марья Дмитриевна.
Все барышни и даже дамы, исключая самых старых, встали. Марья Дмитриевна остановилась в дверях и, с высоты своего тучного тела, высоко держа свою с седыми буклями пятидесятилетнюю голову, оглядела гостей и, как бы засучиваясь, оправила неторопливо широкие рукава своего платья. Марья Дмитриевна всегда говорила по русски.
– Имениннице дорогой с детками, – сказала она своим громким, густым, подавляющим все другие звуки голосом. – Ты что, старый греховодник, – обратилась она к графу, целовавшему ее руку, – чай, скучаешь в Москве? Собак гонять негде? Да что, батюшка, делать, вот как эти пташки подрастут… – Она указывала на девиц. – Хочешь – не хочешь, надо женихов искать.
– Ну, что, казак мой? (Марья Дмитриевна казаком называла Наташу) – говорила она, лаская рукой Наташу, подходившую к ее руке без страха и весело. – Знаю, что зелье девка, а люблю.
Она достала из огромного ридикюля яхонтовые сережки грушками и, отдав их именинно сиявшей и разрумянившейся Наташе, тотчас же отвернулась от нее и обратилась к Пьеру.
– Э, э! любезный! поди ка сюда, – сказала она притворно тихим и тонким голосом. – Поди ка, любезный…
И она грозно засучила рукава еще выше.
Пьер подошел, наивно глядя на нее через очки.
– Подойди, подойди, любезный! Я и отцу то твоему правду одна говорила, когда он в случае был, а тебе то и Бог велит.
Она помолчала. Все молчали, ожидая того, что будет, и чувствуя, что было только предисловие.
– Хорош, нечего сказать! хорош мальчик!… Отец на одре лежит, а он забавляется, квартального на медведя верхом сажает. Стыдно, батюшка, стыдно! Лучше бы на войну шел.
Она отвернулась и подала руку графу, который едва удерживался от смеха.
– Ну, что ж, к столу, я чай, пора? – сказала Марья Дмитриевна.
Впереди пошел граф с Марьей Дмитриевной; потом графиня, которую повел гусарский полковник, нужный человек, с которым Николай должен был догонять полк. Анна Михайловна – с Шиншиным. Берг подал руку Вере. Улыбающаяся Жюли Карагина пошла с Николаем к столу. За ними шли еще другие пары, протянувшиеся по всей зале, и сзади всех по одиночке дети, гувернеры и гувернантки. Официанты зашевелились, стулья загремели, на хорах заиграла музыка, и гости разместились. Звуки домашней музыки графа заменились звуками ножей и вилок, говора гостей, тихих шагов официантов.
На одном конце стола во главе сидела графиня. Справа Марья Дмитриевна, слева Анна Михайловна и другие гостьи. На другом конце сидел граф, слева гусарский полковник, справа Шиншин и другие гости мужского пола. С одной стороны длинного стола молодежь постарше: Вера рядом с Бергом, Пьер рядом с Борисом; с другой стороны – дети, гувернеры и гувернантки. Граф из за хрусталя, бутылок и ваз с фруктами поглядывал на жену и ее высокий чепец с голубыми лентами и усердно подливал вина своим соседям, не забывая и себя. Графиня так же, из за ананасов, не забывая обязанности хозяйки, кидала значительные взгляды на мужа, которого лысина и лицо, казалось ей, своею краснотой резче отличались от седых волос. На дамском конце шло равномерное лепетанье; на мужском всё громче и громче слышались голоса, особенно гусарского полковника, который так много ел и пил, всё более и более краснея, что граф уже ставил его в пример другим гостям. Берг с нежной улыбкой говорил с Верой о том, что любовь есть чувство не земное, а небесное. Борис называл новому своему приятелю Пьеру бывших за столом гостей и переглядывался с Наташей, сидевшей против него. Пьер мало говорил, оглядывал новые лица и много ел. Начиная от двух супов, из которых он выбрал a la tortue, [черепаховый,] и кулебяки и до рябчиков он не пропускал ни одного блюда и ни одного вина, которое дворецкий в завернутой салфеткою бутылке таинственно высовывал из за плеча соседа, приговаривая или «дрей мадера», или «венгерское», или «рейнвейн». Он подставлял первую попавшуюся из четырех хрустальных, с вензелем графа, рюмок, стоявших перед каждым прибором, и пил с удовольствием, всё с более и более приятным видом поглядывая на гостей. Наташа, сидевшая против него, глядела на Бориса, как глядят девочки тринадцати лет на мальчика, с которым они в первый раз только что поцеловались и в которого они влюблены. Этот самый взгляд ее иногда обращался на Пьера, и ему под взглядом этой смешной, оживленной девочки хотелось смеяться самому, не зная чему.
Николай сидел далеко от Сони, подле Жюли Карагиной, и опять с той же невольной улыбкой что то говорил с ней. Соня улыбалась парадно, но, видимо, мучилась ревностью: то бледнела, то краснела и всеми силами прислушивалась к тому, что говорили между собою Николай и Жюли. Гувернантка беспокойно оглядывалась, как бы приготавливаясь к отпору, ежели бы кто вздумал обидеть детей. Гувернер немец старался запомнить вое роды кушаний, десертов и вин с тем, чтобы описать всё подробно в письме к домашним в Германию, и весьма обижался тем, что дворецкий, с завернутою в салфетку бутылкой, обносил его. Немец хмурился, старался показать вид, что он и не желал получить этого вина, но обижался потому, что никто не хотел понять, что вино нужно было ему не для того, чтобы утолить жажду, не из жадности, а из добросовестной любознательности.


На мужском конце стола разговор всё более и более оживлялся. Полковник рассказал, что манифест об объявлении войны уже вышел в Петербурге и что экземпляр, который он сам видел, доставлен ныне курьером главнокомандующему.
– И зачем нас нелегкая несет воевать с Бонапартом? – сказал Шиншин. – II a deja rabattu le caquet a l'Autriche. Je crains, que cette fois ce ne soit notre tour. [Он уже сбил спесь с Австрии. Боюсь, не пришел бы теперь наш черед.]
Полковник был плотный, высокий и сангвинический немец, очевидно, служака и патриот. Он обиделся словами Шиншина.
– А затэ м, мы лосты вый государ, – сказал он, выговаривая э вместо е и ъ вместо ь . – Затэм, что импэ ратор это знаэ т. Он в манифэ стэ сказал, что нэ можэ т смотрэт равнодушно на опасности, угрожающие России, и что бэ зопасност империи, достоинство ее и святост союзов , – сказал он, почему то особенно налегая на слово «союзов», как будто в этом была вся сущность дела.
И с свойственною ему непогрешимою, официальною памятью он повторил вступительные слова манифеста… «и желание, единственную и непременную цель государя составляющее: водворить в Европе на прочных основаниях мир – решили его двинуть ныне часть войска за границу и сделать к достижению „намерения сего новые усилия“.
– Вот зачэм, мы лосты вый государ, – заключил он, назидательно выпивая стакан вина и оглядываясь на графа за поощрением.
– Connaissez vous le proverbe: [Знаете пословицу:] «Ерема, Ерема, сидел бы ты дома, точил бы свои веретена», – сказал Шиншин, морщась и улыбаясь. – Cela nous convient a merveille. [Это нам кстати.] Уж на что Суворова – и того расколотили, a plate couture, [на голову,] а где y нас Суворовы теперь? Je vous demande un peu, [Спрашиваю я вас,] – беспрестанно перескакивая с русского на французский язык, говорил он.
– Мы должны и драться до послэ днэ капли кров, – сказал полковник, ударяя по столу, – и умэ р р рэ т за своэ го импэ ратора, и тогда всэ й будэ т хорошо. А рассуждать как мо о ожно (он особенно вытянул голос на слове «можно»), как мо о ожно менше, – докончил он, опять обращаясь к графу. – Так старые гусары судим, вот и всё. А вы как судитэ , молодой человек и молодой гусар? – прибавил он, обращаясь к Николаю, который, услыхав, что дело шло о войне, оставил свою собеседницу и во все глаза смотрел и всеми ушами слушал полковника.
– Совершенно с вами согласен, – отвечал Николай, весь вспыхнув, вертя тарелку и переставляя стаканы с таким решительным и отчаянным видом, как будто в настоящую минуту он подвергался великой опасности, – я убежден, что русские должны умирать или побеждать, – сказал он, сам чувствуя так же, как и другие, после того как слово уже было сказано, что оно было слишком восторженно и напыщенно для настоящего случая и потому неловко.