Random rnd = new Random();
int ID = rnd.Next(1, 999);
string body = @"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""help here""}";
我怎么能在“帮助这里”中将“ID”添加到字符串主体 所以它可以生成随机数!
答案 0 :(得分:3)
在典型的字符串插入方案中,我执行以下操作之一:
string body = string.Format("My ID is {0}", ID);
string body = "My ID is " + ID;
但是,您的字符串显然是JSON序列化数据。我希望我能够将其解析为一个类以便使用它。
var myObj = JsonConvert.DeserializeObject<MyClass>(someString);
myObj.TID = ID;
// maybe do other things with it, then if I need JSON again...
string body = JsonConvert.SerializeObject(myObj);
采用这种方法的一个原因是确保我输入的任何数据仍然使JSON有效。例如,如果我的ID不是int
,而是带有需要转义的字符的string
,则直接插入"\"\n\""
将不是正确的做法。
答案 1 :(得分:3)
有很多方法可以将值注入字符串中,但是很容易忽略编码,导致严重破坏。
如果您只想将值注入另一个字符串,可以使用:
构建字符串的最简单和最常用的方法是使用+
运算符concatenating them together:
var foo = 5;
var bar = "example-" + foo;
连接可能很难阅读,因此很容易引入错误,但对于大多数简单的任务来说,这是正确的工具。
在这种情况下,这是一个糟糕的选择:
string body = @"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""" + ID.ToString() + @"""}";
StringBuilder
类对于构建大字符串非常有用,特别是在迭代构建时。
var sb = new StringBuilder();
for (var i = 0; i < 1000; i++) {
sb.Append(i.ToString());
sb.Append(" ");
}
var output = sb.ToString();
它仍然很难阅读并且难以调试,但是对于你将大量字符串连接在一起的情况,它是超级高效的
在这种情况下,这是一个糟糕的选择:
StringBuilder sb = new StringBuilder();
sb.Append(@"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""");
sb.Append(ID.ToString());
sb.Append(@"""}");
string body = sb.ToString();
string.Format
方法使模板数据成为一个超级简单有效的字符串。如果计划反复重复使用相同的字符串,使用格式字符串可以更容易地读取和调试代码,特别是在有大量替换时:
var foo = 5;
var bar = string.Format("example-{0}", foo);
格式字符串还可以自动将文化上准确的格式应用于特定数据类型,以便正确显示DateTime
,或者使数字具有适当数量的尾随零。
在这种情况下,这是一个糟糕的选择:
string string.Format(@"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""{0}""}", ID);
您没有将数据转储到任何旧字符串中。这是JSON编码的数据。如果你只是连接/构建/格式化任何旧值,你可以打破你的字符串。例如,如果ID
变量包含"
个字符,则会破坏整个JSON数据集。
此外,字符串的长度和必要的引号使其难以阅读,这使得难以维护。祝你好运,当你需要添加另一个格式化的值时,改变任何现有值或添加新的动态值都会很痛苦。
不是编写JSON文字,而是编写一个对象并将其编码为JSON:
var bodyData =
new
{
currency = "country",
gold = 1,
detail = "detailid-979095986",
tId = ID //here's where you set the ID
};
var jss = new JavaScriptSerializer();
var body = jss.Serialize(bodyData);
当数据发生变化时,此代码更容易修改,并且实际上会正确编码数据。您不必再担心所有那些烦人的双引号字符。
答案 2 :(得分:1)
你可以试试这个:
string body = @"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""" + ID + @"""}";
您还可以使用string.Concat
:
string body = string.Concat(@"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""", ID, @"""}");
答案 3 :(得分:1)
String interpolation is the easiest way these days:
int myIntValue = 123;
string myStringValue = "one two three";
string interpolatedString = $"my int is: {myIntValue}. My string is: {myStringValue}.";
输出为“ 我的整数是:123。我的字符串是:一二三。”。
您可以over here自己尝试该示例。
$特殊字符将字符串文字标识为插值 串。插值字符串是可能包含以下内容的字符串文字 插值表达式。当插值字符串解析为 结果字符串,带有插值表达式的项目将替换为 表达式结果的字符串表示形式。 此功能从C#6开始可用。
答案 4 :(得分:0)
您可以使用
String.Format(@"{""currency"":""country"",""gold"":1,""detail"":""detailid-979095986"",""tId"":""{0}""}", ID)
由于这是params object[]
,您可以根据需要使用尽可能多的{n}
。
答案 5 :(得分:0)
您可以使用+将字符串连接在一起,而不是在字符串上使用,这样就可以在生成的字符串之间插入文本。
string body = @"***" + ID + @"***";