Не удалось декодировать строку 12087 из файла базы данных синтаксическая ошибка неправильный json

Обновлено: 03.07.2024

На ПрочитатьJSON(ЧтениеJSON) Ошибка при вызове метода контекста (ПрочитатьJSON). Что не так не пойму. перечитала синтакс помощник раз 10 уже, даже если пустую строку "<>" дать, то ошибка контекста. Вызывается в общем модуле с галками клиент, сервер, внешнее соединение.

//Разбираем ответ
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);

Попытка
РезультатСоответствие = ПрочитатьJSON(ЧтениеJSON);
Исключение
Сообщить("1");
КонецПопытки;

(0) если пробую в том же месте простенький пример (ниже), то работает. а как прочитать то что возвращает сервер в СтрокаJSON . не пойму. там много, не стала вставлять сюда

В СтрJSON получается

Параметры:
<ЧтениеJSON> (обязательный)
Тип: ЧтениеJSON.
Тип: Булево.
Если установлено Истина, чтение объекта JSON будет выполнено в Соответствие.
Если установлено Ложь, объекты будут считываться в объект типа Структура.

(3) чтение в соответствие выручки только тогда когда ключи не могут быть ключами структуры (точка в имени) свойства наприиер и ещё какой то экзотический случай, но там другая ошибка вроде, не про контекст.
Я бы таки начал с проверки json на валидность и отсутствие недопустимых символов
Параметры:
<ЧтениеJSON> (обязательный)
Тип: ЧтениеJSON.
Тип: Булево.
Если установлено Истина, чтение объекта JSON будет выполнено в Соответствие.
Если установлено Ложь, объекты будут считываться в объект типа Структура.
Примечание. При десериализации объектов JSON в структуру необходимо помнить о требованиях к ключам структуры. Если при десериализации объекта будет найдено имя свойства, недопустимое для ключа структуры, то будет вызвано исключение.
Значение по умолчанию: Ложь.
Полное описание ошибки есть? Ошибка метода контекста обычно сопровождается каким-нибудь комментарием.

(12) неа. все что есть↓

Вызовите метод ПрочитатьJSON вне попытки или в Сообщить() передайте ОписаниеОшибки(). В отладке полное описание ошибки не увидеть.
(14) ОписаниеОшибки при попадании в исключение в предприятии вывело
: Ошибка при вызове метода контекста (ПрочитатьJSON): Недопустимое состояние потока записи JSON
(17)+ Два варианта или в строку все не влезло или не валидный json с точки зрения 1С.
Попробуй как в файлу сохранишь поизвращаться с ним, убрать разные левости (типа "\/" и прочего) и выяснить на чем падает.
(17)+ Кодировку проверить, может есть некорректные символы на которые валидаторы плюют а 1С падает

(21) все равно валится с Недопустимое состояние потока записи JSON. видимо в строке серьезные косяки для 1с

(23) Выложи этот ИмяВремФайла куда то и сам его проверь глазками.
(28) а насчет дат заморачиваться или их должно бы прочитать?
(29) Возьми эти строковые даты, вставь в пустой json и попробуй парсятся ли в 1С.
И аналогично со всеми подозрительными
сейчас много работаю с json но не в 1с, основных причин сабжа всего 3
2. дробим на куски по уровням вложености и пробуем загрузить в 1с кусочки
(32) Другое дело. Все сразу стало понятно. )))
Обычно в дешевых американских фильмах вместо вот этого :
"1. не сериализуемый объект
Результат и одного и другого одинаков.

(28) какая-то странная фигня происходит..

в общем если поставить одну точку останова на Сообщить("5 все ок") или Сообщить("5") то до нее доходит без ошибок, читает в соответствие, и ссылки со слешами верно читает, только дата в виде строки в итоге "2020-05-14T09:34:23+03:00"
в структуру не читает, т.к. есть такое вот в строке ". "edit.originator":true. " ну а в структуре нельзя точку в заголовок, ок, допустим, пусть соответствие.

но если поставить точку останова где-то до попытки и идти пошагово, то вываливается на ПрочитатьJSON в исключение.

Здесь приведены ответы на некоторые распространенные вопросы о встроенной поддержке JSON в SQL Server.

Выходные данные FOR JSON и JSON

FOR JSON PATH или FOR JSON AUTO?

Вопрос. Мне нужно создать текстовый результат JSON из простого SQL-запроса для одной таблицы. Выходные данные для FOR JSON PATH и FOR JSON AUTO совпадают. Какой из этих вариантов следует использовать?

Ответ. Используйте FOR JSON PATH. Несмотря на отсутствие различий в выходных данных JSON, режим AUTO применяет дополнительную логику, определяющую потребность во вложенных столбцах. Рассматривайте PATH как параметр по умолчанию.

Создание вложенной структуры JSON

Вопрос. Мне нужно создать сложную JSON с несколькими массивами на одном уровне. FOR JSON PATH может создавать вложенные объекты с использованием путей, а FOR JSON AUTO создает дополнительный уровень вложенности для каждой таблицы. Ни один из этих параметров не позволяет мне получить нужный результат. Как создать настраиваемый формат JSON, который напрямую не поддерживается существующими параметрами?

Ответ. Любую структуру данных можно создать, добавив запросы FOR JSON в качестве выражений столбца, возвращающих текст JSON. Кроме того, JSON можно создать вручную с помощью функции JSON_QUERY. Применение этих функции показано в приведенном ниже примере.

Каждый результат запроса FOR JSON или функции JSON_QUERY в выражениях столбца форматируется в виде отдельного вложенного подчиненного объекта JSON и включается в основной результат.

Предотвращение появления дважды экранированного JSON в выходных данных FOR JSON

Вопрос. Имеется текст JSON, хранящийся в столбце таблицы. Я хочу включить его в выходные данные FOR JSON. При этом FOR JSON экранирует все символы в JSON, поэтому я получаю строку JSON вместо вложенного объекта, как показано в следующем примере.

Этот запрос получает следующие выходные данные.

Как можно избежать этого? Я хочу, чтобы возвращался в виде объекта JSON, а не escape-текста.

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

JSON_QUERY без второго необязательного параметра возвращает в качестве результата только первый аргумент. Так как JSON_QUERY всегда возвращает правильный объект JSON, FOR JSON определяет, что экранировать этот результат не нужно.

JSON, созданная с помощью предложения WITHOUT_ARRAY_WRAPPER, экранируется в выходных данных FOR JSON

Вопрос. Я пытаюсь отформатировать выражение столбца с помощью FOR JSON и параметра WITHOUT_ARRAY_WRAPPER.

Похоже, что текст, возвращаемый запросом FOR JSON, экранируется как обычный текст. Это происходит только в том случае, если указан WITHOUT_ARRAY_WRAPPER. Почему он не рассматривается в качестве объекта JSON и не включается в результат неэкранированным?

Ответ. Если параметр WITHOUT_ARRAY_WRAPPER указан во внутреннем FOR JSON , создаваемый текст JSON может оказаться недопустимым объектом JSON. Поэтому внешний FOR JSON предполагает, что это обычный текст, и экранирует строку. Если вы уверены, что выходные данные JSON допустимы, заключите их в оболочку с помощью функции JSON_QUERY , чтобы превратить в правильно отформатированную JSON, как показано в следующем примере.

Возвращение вложенного подчиненного объекта JSON из текста JSON с помощью OPENJSON

Вопрос. Не удается открыть массив cоставных объектов JSON, содержащий скалярные значения, объекты и массивы, с помощью OPENJSON с явной схемой. Когда я ссылаюсь на ключ в предложении WITH, возвращаются только скалярные значения. Объекты и массивы возвращаются в виде значений NULL. Как извлекать объекты или массивы в качестве объектов JSON?

Ответ. Если требуется возвратить объект или массив в виде столбца, используйте параметр AS JSON в определении столбца, как показано в следующем примере.

Вместо JSON_VALUE возвращается длинное текстовое значение с параметром OPENJSON.

Вопрос. В тексте JSON имеется ключ описания, содержащий длинный текст. JSON_VALUE(@json, '$.description') возвращает NULL, а не значение.

Ответ. JSON_VALUE предназначена для возврата небольших скалярных значений. Обычно эта функция возвращает значение NULL вместо ошибки переполнения. Если требуется возвратить более длинные значения, используйте OPENJSON, поддерживающую значения NVARCHAR(MAX), как показано в следующем примере.

Для обработки повторяющихся ключей вместо JSON_VALUE используйте параметр OPENJSON.

Вопрос. В тексте JSON есть повторяющиеся ключи. JSON_VALUE возвращает только первый ключ, найденный в пути. Как возвратить все ключи с одинаковыми именами?

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

OPENJSON необходим уровень совместимости 130

Вопрос. Я пытаюсь выполнить OPENJSON в SQL Server 2016, но получаю следующую ошибку.

Msg 208, Level 16, State 1 'Invalid object name OPENJSON'

Ответ. Функция OPENJSON доступна только при уровне совместимости 130. Если уровень совместимости базы данных ниже 130, функция OPENJSON будет скрыта. Другие функции JSON доступны на всех уровнях совместимости.

Другие вопросы

Ключи ссылки, содержащие символы, отличные от буквенно-цифровых, в тексте JSON

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

Ответ. Необходимо заключить их в кавычки в путях JSON. Например, JSON_VALUE(@json, '$."$info"."First Name".value') .

Дополнительные сведения о JSON в SQL Server и базе данных SQL Azure

Видео Майкрософт

Наглядные инструкции по встроенной поддержке JSON в SQL Server и базе данных SQL Azure см. в следующих видео.

SQL Server 2016 and JSON Support (SQL Server 2016 и поддержка JSON)

Using JSON in SQL Server 2016 and Azure SQL Database (Использование JSON в SQL Server 2016 и базе данных SQL Azure)

JSON as a bridge between NoSQL and relational worlds (JSON как мост между NoSQL и реляционными решениями)

Возвращает последнюю ошибку (если она есть), произошедшую во время последнего кодирования/декодирования JSON если при вызове не использовался флаг JSON_THROW_ON_ERROR .

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целочисленное значение, которое может быть одной из следующих констант:

Коды ошибок JSON
Константа Значение Доступность
JSON_ERROR_NONE Ошибок нет
JSON_ERROR_DEPTH Достигнута максимальная глубина стека
JSON_ERROR_STATE_MISMATCH Неверный или некорректный JSON
JSON_ERROR_CTRL_CHAR Ошибка управляющего символа, возможно неверная кодировка
JSON_ERROR_SYNTAX Синтаксическая ошибка
JSON_ERROR_UTF8 Некорректные символы UTF-8, возможно неверная кодировка
JSON_ERROR_RECURSION Одна или несколько зацикленных ссылок в кодируемом значении
JSON_ERROR_INF_OR_NAN Одно или несколько значений NAN или INF в кодируемом значении
JSON_ERROR_UNSUPPORTED_TYPE Передано значение с неподдерживаемым типом
JSON_ERROR_INVALID_PROPERTY_NAME Имя свойства не может быть закодировано
JSON_ERROR_UTF16 Некорректный символ UTF-16, возможно некорректно закодирован

Примеры

// Неверная json-строка, которая вызовет синтаксическую ошибку,
// здесь в качестве кавычек мы используем ' вместо "
$json [] = "" ;

foreach ( $json as $string ) echo 'Декодируем: ' . $string ;
json_decode ( $string );

switch ( json_last_error ()) case JSON_ERROR_NONE :
echo ' - Ошибок нет' ;
break;
case JSON_ERROR_DEPTH :
echo ' - Достигнута максимальная глубина стека' ;
break;
case JSON_ERROR_STATE_MISMATCH :
echo ' - Некорректные разряды или несоответствие режимов' ;
break;
case JSON_ERROR_CTRL_CHAR :
echo ' - Некорректный управляющий символ' ;
break;
case JSON_ERROR_SYNTAX :
echo ' - Синтаксическая ошибка, некорректный JSON' ;
break;
case JSON_ERROR_UTF8 :
echo ' - Некорректные символы UTF-8, возможно неверно закодирован' ;
break;
default:
echo ' - Неизвестная ошибка' ;
break;
>

Результат выполнения данного примера:

<?php
// Некорректная последовательность UTF8
$text = "\xB1\x31" ;

$json = json_encode ( $text );
$error = json_last_error ();

var_dump ( $json , $error === JSON_ERROR_UTF8 );
?>

Результат выполнения данного примера:

<?php
// Некорректная последовательность UTF8, вызывающая JSON_ERROR_UTF8
json_encode ( "\xB1\x31" );

// Не вызовет ошибки JSON
json_encode ( 'okay' , JSON_THROW_ON_ERROR );

// Глобальное состояние не будет изменено json_encode()
var_dump ( json_last_error () === JSON_ERROR_UTF8 );
?>

Я столкнулся с той же проблемой, на самом деле есть некоторые скрытые символы, невидимые, и вам нужно удалить его.
Вот глобальный код, который работает во многих случаях:

Другие решения

Удаление BOM (Byte Order Mark) часто является решением, которое вам нужно:

У вас не должно быть спецификации, но если она есть, она невидима, поэтому вы ее не увидите !!

Я решил эту проблему, добавив stripslashes в строку, перед json_decode.

Чтобы собрать все вместе, я подготовил JSON-оболочку с расшифровкой автокорректирующих действий. Самую последнюю версию можно найти в моем GitHub Gist .

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

Попробовав все решение без результата, это сработало для меня.

Надеюсь, это поможет кому-то

В начале файла я объявил тег разрыва строки … Так что это была ошибка для меня. Удалив этот тег разрыва строки, я смог […]

(PHP 5 >= 5.3.0, PHP 7)

json_last_error — Возвращает последнюю ошибку

Описание

Возвращает последнюю ошибку (если она есть), произошедшую во время последнего кодирования/декодирования JSON если при вызове не использовался флаг JSON_THROW_ON_ERROR .

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целочисленное значение, которое может быть одной из следующих констант:

Коды ошибок JSON

Примеры

foreach ( $json as $string )

Результат выполнения данного примера:

$json = json_encode ( $text );
$error = json_last_error ();

var_dump ( $json , $error === JSON_ERROR_UTF8 );
?>

Результат выполнения данного примера:

// Глобальное состояние не будет изменено json_encode()
var_dump ( json_last_error () === JSON_ERROR_UTF8 );
?>

Результат выполнения данного примера:

Смотрите также

From the last answer I know there is UTF8 DOM in the json return. I tried the answer from a similar question: json_decode returns NULL after webservice call, but all of the answers not work for me.

And after do more research I found a way that works:

This successfully decode the json into array. However all Chinese and Japanese character string were removed too. Any ideas?

При синтаксическом анализе строки JSON, полученной от одного из наших веб-сервисов RESTful, я получал эту ошибку «Исключение в потоке« main »com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: нераспознанное поле« person »(класс Hello $ Person), а не помечен как игнорируемый » .

Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: <b>Unrecognized field "person" < /b > (class Hello$Person), not marked as ignorable (4 known properties: , "id" , "city" , "name" , "phone" ])

Наш класс POJO выглядит следующим образом:

Если вы посмотрите внимательно, поле «person» указывает на массив JSON, а не на объект, что означает, что его нельзя напрямую сопоставить с классом person.

Как решить эту проблему

Вот шаги, чтобы решить эту проблему и избавиться от этой ошибки:

1) Сконфигурируйте ObjectMapper Джексона, чтобы он не завершался ошибкой, когда привлекает неизвестные свойства

Вы можете сделать это, отключив свойство D eserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES как показано ниже:

// Jackson code to convert JSON String to Java object objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

Теперь ошибка исчезнет, ​​но вывод не соответствует ожидаемому, он выведет следующее:

Вы можете видеть, что класс Person не создан должным образом, соответствующие атрибуты имеют значение null, даже если строка JSON содержит его значение.

Причина в том, что JSON String содержит массив JSON , поле person указывает на массив, и в классе Person нет соответствующего ему поля.

Чтобы правильно проанализировать строку JSON, нам нужно создать класс-оболочку Community которого будет атрибут для хранения массива Person, как показано ниже:

Теперь мы преобразуем строку JSON в этот класс Community и напечатаем каждого человека из списка, как показано ниже:

//objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); Community c = objectMapper.readValue(JSON, Community. class );

Это распечатает данные человека должным образом, как показано ниже:

Person [ id =11, name=John, city=NewYork, phone=7647388372]

Теперь, возвращаясь к более общей ситуации, когда новое поле добавляется в JSON, но недоступно в вашем классе Person , давайте посмотрим, что произойдет.

Предположим, что наша строка JSON для разбора выглядит следующим образом:

Когда вы запустите ту же программу с этой строкой JSON , вы получите следующую ошибку:


Опять же, Джексон не может распознать новое свойство «Facebook». Теперь мы можем игнорировать это свойство, отключив функцию, которая сообщает Джексону об отказе в неизвестном свойстве, как показано ниже:

objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); Community c = objectMapper.readValue(JSON, Community.class);

И это правильно напечатает класс person, как показано ниже:

Person [ id =11, name=John, city=NewYork, phone=7647388372]

Кроме того, вы также можете использовать аннотацию @JsonIgnoreProperties чтобы игнорировать необъявленные свойства.

Эта аннотация обеспечивает контроль на уровне класса, т.е. вы можете сказать Джексону, что для этого класса, пожалуйста, игнорируйте любой атрибут, не определенный при выполнении

Итак, наш класс Person теперь выглядит так:

Пример программы

import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonMappingException; public static void main(String args[]) throws JsonParseException, objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); Community c = objectMapper.readValue(JSON, Community. class ); return "Person [id java plain">+ id + ", name java plain">+ name + ", city java plain">+ city

Когда я запускаю первую версию этой программы, меня встречает следующая ошибка:

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type , class Hello$Person]: can not instantiate from JSON object (need to add /enable type information?) at [Source: java.io.StringReader@5e329ba8; line: 2, column: 3] at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:984) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:276) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034)

Эта ошибка произошла из-за того, что мой вложенный класс Person не был статичным, что означает, что его нельзя создать из-за наличия экземпляра внешнего класса. Проблема решена после того, как класс Person статическим .

Если вы не знакомы с этой деталью раньше, я предлагаю вам проверить
Основы Java: Базовая платформа , бесплатный курс от Pluralsight, чтобы узнать больше о таких деталях языка программирования Java. Вы можете подписаться на бесплатную пробную версию, которая дает вам 10-дневный доступ, достаточный для изучения всей Java бесплатно.


Теперь посмотрим на реальную ошибку:

Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: <b>Unrecognized field "person" (class Hello$Person), not marked as ignorable< /b > (4 known properties: , "id" , "city" , "name" , "phone" ]) at [Source: java.io.StringReader@4fbc9499; line: 2, column: 14] (through reference chain: Person[ "person" ]) at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:79) at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:555) at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:708) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1160) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:315) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034)

Когда вы запустите финальную версию программы, вы увидите следующий вывод:

Person [ id =11, name=John, city=NewYork, phone=7647388372]

Как скомпилировать и запустить эту программу?

Вы можете просто скопировать вставить код в вашу любимую IDE, например, Eclipse, чтобы скомпилировать и запустить программу.

В Eclipse вам даже не нужно создавать файл класса, потому что он автоматически создаст класс и пакет, если вы скопируете и вставите код в проект Java.


Это бесплатный онлайн-курс для изучения как основных, так и расширенных возможностей Eclipse IDE, о которых должен знать каждый разработчик Java. Вы можете получить доступ к этому курсу, подписавшись на бесплатную пробную версию, которая дает вам 10-дневный доступ ко всей библиотеке Pluralsight, одной из самых ценных коллекций для изучения программирования и других технологий. Кстати, 10 дней более чем достаточно для изучения Java и Eclipse вместе.

В любом случае, после копирования вставьте код, все, что вам нужно сделать, это включить зависимость Maven в ваш файл pom.xml или вручную загрузить требуемый JAR-файл для библиотеки с открытым исходным кодом Jackson .

Для пользователей Maven

Вы можете добавить следующую зависимость Maven к pom.xml вашего проекта, а затем выполнить команду mvn build или mvn install для компиляции:

Эта зависимость требует jackson-annotations jackson-core и jackson-annotations но Maven автоматически загрузит их для вас.

Загрузка JAR вручную

Если вы не используете Maven или какой-либо другой инструмент сборки eggradle, вы можете просто зайти в центральную библиотеку Maven и загрузить следующие три JAR-файла и включить их в ваш путь к классам:

После того, как вы успешно скомпилировали класс, вы можете запустить их, как и любую другую программу на Java в Eclipse, как показано здесь, или вы можете запустить файл JAR с помощью командной строки, как показано
здесь

Короче говоря, ошибка « com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: нераспознанное поле XXX, не помеченное как игнорируемое» возникает при попытке проанализировать JSON для объекта Java, который не содержит все поля, определенные в JSON. Эту ошибку можно устранить, отключив функцию Джексона, которая сообщает об ошибке при обнаружении неизвестных свойств, или используя аннотацию @JsonIgnoreProperties на уровне класса.

Дальнейшее обучение

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

Мнения, высказанные участниками Java Code Geeks, являются их собственными.

Читайте также: