39

次のコードは、入力文字列が正しい形式ではなかったというエラーを出し続けますが、それは正しいと確信していますね。

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である必要がありますか?

4

5 に答える 5

80

"{"、 "}"を(複製して)フォーマット文字列でエスケープします。

"{{ 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個の要素があります。

于 2013-01-29T00:21:18.617 に答える
8

newDataには21個の要素がありますが、22個のプレースホルダー(0から21までの番号)を使用します。

また、入力データのリテラル'{'をエスケープする必要があります

中括弧の開閉は、フォーマット項目の開始と終了として解釈されます。したがって、エスケープシーケンスを使用して、リテラルの開始中括弧または終了中括弧を表示する必要があります。固定テキストで2つの中括弧( "{{")を指定して1つの中括弧( "{")を表示するか、2つの中括弧( "}}")を指定して1つの中括弧( "}")を表示します。フォーマット項目の中括弧は、検出された順序で順番に解釈されます。ネストされた中括弧の解釈はサポートされていません。

http://msdn.microsoft.com/en-us/library/txafckwd.aspx

于 2013-01-29T00:21:10.563 に答える
3

コメントでも同じように言っていますが、今では答える価値があると思います。

使用しないstring.Formatでください(この場合)。速度が遅く、読みにくくなります。複雑な連結が必要な場合は、意味のある変数名を使用してプレーンな文字列連結を使用するだけです。これらはより高速で保守しやすくなります。セグメントの数が固定されている場合は、コンパイラの最適化によりプレーン+最速のオプションであるため高速であり、リーダーは変数が配置されている文字列内のコンテキストを確認できるため、保守が容易です。

Hans Passantが指摘したように、JavaScriptリテラルを作成しているようです。その場合は、代わりにJson.NETのようなJsonシリアライザーを検討してください。

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には日付の標準化された形式がないため、これらはiso8601形式の文字列としてシリアル化されます。これは必要なものではない可能性があるため、この例の日付文字列-最初にiso形式を試してみますが、これが最も簡単な解決策です。

于 2013-01-29T10:29:44.420 に答える
2

中括弧をエスケープすることに加えて、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);
于 2013-01-29T00:49:59.477 に答える
1

String cmd = String.Format(data, id.toString(), newData);  

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);
于 2013-01-29T01:00:22.160 に答える