String.Format: строка ввода не была в правильном формате
Следующий код продолжает давать мне ошибку: строка ввода не была в правильном формате, но я уверен, что это правильно, не так ли?
int id = 112;
String[] newData = { "1", "2", "21", "reidb", "reidb", "reidb", "reidb", "aa",
"Some description", "11", "2012-02-28", "2012-01-29", "true", "1", "1",
"true", "note note note", "true", "1", "2011-12-03", "45"};
String data = "{ cmd: \"save magellan deal\", data: { id: {0} , AId: {1}, " +
"CId: {2}, CCId:{3}, LA: \"{4}\", BA: \"{5}\" , " +
"LSA: \"{6}\" , BSA: \"{7}\" , \"path: \"{8}\"," +
"dscp: \"{9}\", SI: \"{10}\", CD: \"{11}\", " +
"period: \"{12}\", IsStatic: {13}, LSD: {14}, LC: {15}, RB: {16},} " +
"Notes: \"{17}\", IsEE: {18}, RBy: {19}, DPDD: \"{20}\", LId: {21} } }";
String cmd = String.Format(data, id.toString(), newData);
Любые идеи?
=== РЕДАКТИРОВАТЬ ===
после фиксации фигурных скобок новая ошибка "Индекс (на основе нуля) должна быть больше или равна нулю и меньше, чем размер списка аргументов". дано. newData имеет 21 и плюс id.toString(), должен быть точным 22?
Ответы
Ответ 1
Побегите "{", "}" (путем их дублирования) в строке формата:
"{{ cmd: \"save magellan deal\", data: {{ id: {0} , AId: {1}, " +
"CId: {2}, CCId:{3}, LA: \"{4}\", BA: \"{5}\" , " +
"LSA: \"{6}\" , BSA: \"{7}\" , \"path: \"{8}\"," +
"dscp: \"{9}\", SI: \"{10}\", CD: \"{11}\", " +
"period: \"{12}\", IsStatic: {13}, LSD: {14}, LC: {15}, RB: {16},}} " +
"Notes: \"{17}\", IsEE: {18}, RBy: {19}, DPDD: \"{20}\", LId: {21} }} }}"
И у вас есть 22 элемента в строке формата и 21 в массиве.
Ответ 2
У вас есть 21 элемент в newData, но используйте 22 заполнителя (с номерами от 0 до 21).
Кроме того, вы должны избегать букв '{' в ваших входных данных
Открытие и закрытие фигурных скобок интерпретируются как начало и конец элемента формата. Следовательно, вы должны использовать escape-последовательность для отображения литеральной открывающей скобки или закрывающей скобки. Задайте две открывающиеся фигурные скобки ( "{{" ) в фиксированном тексте, чтобы отобразить одну открывающую скобу ( "{" ) или две закрывающие фигурные скобки ( "}}" ), чтобы отобразить одну закрывающую фигуру ( "}" ). Скобки в элементе формата интерпретируются последовательно в том порядке, в котором они встречаются. Интерпретация вложенных фигурных скобок не поддерживается.
http://msdn.microsoft.com/en-us/library/txafckwd.aspx
Ответ 3
В дополнение к экранированию фигурных скобок также попробуйте изменить определение String[]
на:
int id = 112;
String[] newData = {id.ToString(), "1", "2", "21", "reidb", "reidb", "reidb", "reidb", "aa",
"Some description", "11", "2012-02-28", "2012-01-29", "true", "1", "1",
"true", "note note note", "true", "1", "2011-12-03", "45"};
и измените ваш String.Format
на:
String cmd = String.Format(data,newData);
Ответ 4
Я так сказал в комментариях, но думаю, что сейчас стоит ответить:
Не используйте string.Format
(в данном случае). Это медленнее и менее читаемо. Просто используйте сплошную конкатенацию строк со значимыми именами переменных, если вам нужны сложные конкатенации - они будут быстрее и удобнее обслуживать. Быстрее, потому что для фиксированного количества сегментов plain +
самый быстрый вариант из-за оптимизации компилятора и более ремонтопригодный, поскольку читатель может видеть контекст в строке, в которую помещена переменная.
Как отметил Ханс Пассант, похоже, что вы делаете букву javascript. В этом случае рассмотрим сериализатор Json, например Json.NET:
JsonConvert.SerializeObject(new {
cmd = "save magellan deal",
data = new {
id = 12345, AId = 1, CId = 2, CCId = 21,
LA = "reidb", BA = "reidb", LSA = "reidb", BSA = "reidb",
path = "aa", dscp = "Some description", SI = 11,
CD = "2012-02-28", period = "2012-01-29",
IsStatic = true, LSD = 1, LC = 1, RB = true,
},
Notes = "note note note",
IsEE = true, RBy = 1, DPDD = "2011-12-03", LId = 45
})
Хотя Json.NET
поддерживает сериализацию DateTime
, в JS нет стандартизованного формата дат, поэтому они сериализуются как строки в формате iso 8601. Возможно, это не то, что вам нужно, поэтому строки даты в этом примере - я сначала попробую формат iso, поскольку это самое простое решение.
Ответ 5
Что
String cmd = String.Format(data, id.toString(), newData);
is is: пытается форматировать данные String, используя только 2 строки.. не 22!!
Какие?... 1) id.ToString() и 2) newData.ToString()
Это явно неправильно.
Как вы можете видеть, что это проблема...? Оставьте только {0} и {1} в строке данных и распечатайте его. Он компилируется в порядке и видит, что вы получаете.
Конечно, вы должны использовать {{вместо {где вам нужен строковый литерал
Полностью работающее решение:
int id = 112;
String[] newData = { id.ToString(),"1", "2", "21", "reidb", "reidb", "reidb", "reidb", "aa",
"Some description", "11", "2012-02-28", "2012-01-29", "true", "1", "1",
"true", "note note note", "true", "1", "2011-12-03", "45"};
String data = "{{ cmd: \"save magellan deal\", data: {{ id: {0} , AId: {1}, " +
"CId: {2}, CCId:{3}, LA: \"{4}\", BA: \"{5}\" , " +
"LSA: \"{6}\" , BSA: \"{7}\" , \"path: \"{8}\"," +
"dscp: \"{9}\", SI: \"{10}\", CD: \"{11}\", " +
"period: \"{12}\", IsStatic: {13}, LSD: {14}, LC: {15}, RB: {16},}} " +
"Notes: \"{17}\", IsEE: {18}, RBy: {19}, DPDD: \"{20}\", LId: {21} }} }}";
String cmd = String.Format(data, newData);