Chaîne de caractères.Format: chaîne d'Entrée n'était pas dans un format correct
Le code suivant donnez-moi de l'erreur en disant: chaîne d'Entrée n'était pas dans un format correct, mais je suis assez sûr qu'il est juste, n'est-ce pas?
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);
Personne des idées?
=== EDIT ===
après la fixation de l'appareil dentaire, une nouvelle erreur de "l'Index (de base zéro) doit être supérieur ou égal à zéro et inférieur à la taille de la liste d'arguments." est donné. le newData a 21 ans et plus de l'id.toString(), doit être exacte 22?
- Vous devez vous échapper d'accolades. L'utilisation de deux pour les données json '{{'.
- quel est votre format..? rechercher sur la façon d'utiliser des chaînes de caractères.Format
- personnellement, je ne voudrais pas utiliser
string.Format
pour ce tout - c'est juste en ajoutant de la complexité pour aucune bonne raison. Il n'y a aucun moyen que vous pouvez savoir rapidement quel argument va à laquelle l'espace réservé. la concaténation de chaîne a la même sémantique, ne peut échapper règles à retenir, et il est même légèrement plus rapide - et puis, vous pouvez réellement voir le contexte des variables de l'insertion, qui, je suppose avoir une signification dans le programme réel. - Je suis d'accord sur la complexité, mais en désaccord à propos de la vitesse. Les chaînes sont immuables en C#, donc faire des concaténations de chaînes multiples, comme dans ce cas est susceptible d'être plus lente. Cependant, la différence de performances n'est pas susceptible d'affaire pour la plupart des cas d'utilisation donc je serais favorable à une meilleure, plus facile à gérer le code sur la Chaîne.Format.
- C'est assez horrible de code. Avez-vous au moins considérée comme un véritable sérialiseur json?
- J. de la chaîne peut être immuable, mais derrière les coulisses de la chaîne.Le Format de construire une nouvelle chaîne de caractères par concaténation. En outre, il doit analyser la chaîne de format - quelque chose qui n'est pas gratuit; il s'agit fort probablement de la partie la plus coûteuse de l'ensemble de l'opération. En revanche, un tas de inline chaîne-concaténations sont optimisés par le compilateur C# pour juste un concat appel, c'est à dire un peu plus rapide que
string.Join
ouStringBuilder
. Donc il n'y a pas de raison technique pour l'éviter; et votre code sera plus lisible pour elle. - Je n'ai même pas voir la ressemblance avec le JSON dans un premier temps! Vous avez raison, il faut juste utiliser les Json.NET s'il essaie de faire un script javascript littérale. Il ne fait pas (valide) JSON de toute façon, étant donné que les grands noms ne sont pas cités, et les navigateurs modernes va s'étouffer sur qu' (donc c'est probablement un js littérale).
- Chaîne de caractères.Format utilise un StringBuilder.AppendFormat interne de la reflector.webtropy.com/default.aspx/4@0/4@0/DEVDIV_TFS/Dev10/... qui alloue un tampon et remplit le tampon. Il ne fait pas de concaténation de chaîne pour chaque argument. reflector.webtropy.com/default.aspx/4@0/4@0/DEVDIV_TFS/Dev10/...
- la chaîne de la construction en ce que la mode est la concaténation de chaîne. Je suis désolé, je n'ai pas été clair: je ne veux pas dire qu'il utilise la méthode de la chaîne.Concat. Je voulais dire que c'est le formatage de la chaîne par la concaténation d'un tas de petites chaînes. Pour être clair: ce n'est pas invalider la unreadableness que
string.Format
souvent les causes, ni les pauvres vérification de type, ni le fait que la chaîne de caractères.Le Format est un peu plus lent. Certes, la différence de performances n'est pas assez grand à la matière -, mais sa certainement pas une raison de préférer la chaîne.Format soit.
Vous devez vous connecter pour publier un commentaire.
Échapper à la "{", "}" (par duplication) dans la chaîne de format:
Et vous avez 22 éléments dans la chaîne de format et 21 dans le tableau.
Vous avez 21 éléments en newData mais l'utilisation de 22 espaces réservés (numérotés de 0 à 21).
Aussi, vous devez vous échapper littérale '{' dans vos données d'entrée
http://msdn.microsoft.com/en-us/library/txafckwd.aspx
Je l'ai dit, comme beaucoup dans les commentaires, mais je pense qu'il vaut la peine d'une réponse maintenant:
Ne pas utiliser
string.Format
(dans ce cas). C'est plus lent, et moins lisible. Utilisez simplement la plaine de concaténation de chaînes signifiantes, les noms de variables si vous avez besoin de complexes concaténations - ci va être plus rapide et plus facile à gérer. Plus vite, parce que pour un nombre de segments de la plaine+
est l'option la plus rapide grâce à des optimisations du compilateur, et plus facile à maintenir car le lecteur peut voir le contexte au sein de la chaîne dans laquelle la variable est mis.Comme Hans Passant noté, il semble que vous faites un javascript littérale. Si c'est le cas, envisager un sérialiseur Json comme Json.NET à la place:
Tout
Json.NET
prend en chargeDateTime
la sérialisation, il n'y a pas de format normalisé pour les dates en JS, donc ce sont sérialisés en tant que chaînes de caractères dans un format iso 8601. Cela pourrait ne pas être ce dont vous avez besoin, donc la date de chaînes dans cet exemple - je voudrais essayer le format iso première, même si, comme c'est la solution la plus simple.En plus de s'échapper de votre accolades aussi essayer de changer votre
String[]
définition:et de changer votre
String.Format
à:Ce
est la suivante: essayer de formater les données de la Chaîne , à l'aide de seulement 2 chaînes..pas 22!!
Lesquels?...1)id.ToString() et 2)newData.ToString()
C'est évidemment faux
Comment vous pouvez voir que c'est le problème...? Laissez juste {0} et {1} dans la chaîne de données, et de l'imprimer.Il compile ok et voir ce que vous obtenez.
Bien sûr, vous devez utiliser {{ à la place de { lorsque vous voulez un littéral de chaîne
Pleinement Solution de travail: