如何在 json 单引号中编写 C# 字符串
How to write c# string in json single quotes
我正在 json-rpc 中编写程序,我想在 json 字符串中声明字符串变量 我在声明它时犯了错误,不知道那里的正确格式是什么谁能解决这个问题。
(string amnt= "1000000"
我要声明在json单引号内)
string amnt = "100000000";
string json = @"
{
'method': 'submit',
'params': [{
'secret': 'snL7AcZbKsHm1H7VjeZg7gNS55Xkd',
'tx_json': {
'Account': 'rHSqhmuevNJg9ZYpspYHNnQDxraozuCk5p',
'TransactionType': 'PaymentChannelCreate',
'Amount': '"+amnt+"',
'Destination': 'rD6CGd2uL9DZUVDNghMqAfr8doTzKbEtGA',
'SettleDelay': 86400,
'PublicKey': '023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6',
'DestinationTag': 20170428
},
'fee_mult_max': 1000
}]
}";
立即问题是你有两个字符串文字:一个逐字字符串文字在开头,然后是常规字符串字面值 与amnt
字符串连接后。为了使查看更简单,您有:
string text = @"some text
more text" + amnt + "more text
more text";
第二个字符串文字是常规字符串文字,这意味着它不能跨越多行。这就是您目前收到错误消息的原因。
这不是您遇到的唯一问题:
- 你现在生成的JSON无论如何都是无效的,因为所有这些单引号都应该是双引号。虽然几个 JSON 解析器将允许单引号,但这确实违反了 RFC 7159
- 将所有内容都放在字符串文字中是一种非常脆弱的生成方式JSON。很容易犯一个小错字并最终导致 JSON.
无效
这里有几个选项:
- 您可以使用逐字 interpolated 字符串文字,允许您使用
{amnt}
编写单个文字以包含其中的值。缺点是您需要将所有大括号加倍以表明您想要真正的大括号
- 您可以使第二个字符串文字成为逐字字符串文字,方法是在其开头添加
@
- 您可以避免在字符串中执行所有这些操作,并使用 JSON 库来生成 JSON.
我 肯定会 选择最后一个选项 - 我会使用 Json.NET.
在 Json.NET 中有很多方法可以做到这一点。例如:
- 您可以在常规 类 中为 JSON 对象建模,并序列化那些 类 的实例。如果您不止一次需要这个 JSON,我会这样做。这将允许您为属性使用惯用的 C# 名称,使用特性来指定这些属性应如何在 JSON.
中表示
- 您可以使用 LINQ to JSON 创建
JObject
和 JArray
个实例。
- 您可以使用匿名类型。
这是后一种方法的示例:
using System;
using Newtonsoft.Json;
class Test
{
public static void Main()
{
string amount = "1000000";
var obj = new
{
method = "submit",
// Note: @ is required as params is a keyword
@params = new[]
{
new
{
secret = "snL7AcZbKsHm1H7VjeZg7gNS55Xkd",
tx_json = new
{
Account = "rHSqhmuevNJg9ZYpspYHNnQDxraozuCk5p",
TransactionType = "PaymentChannelCreate",
Amount = amount,
Destination = "rD6CGd2uL9DZUVDNghMqAfr8doTzKbEtGA",
SettleDelay = 86400,
PublicKey = "023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6",
DestinationTag = 20170428
},
fee_mult_max = 1000
}
}
};
string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
Console.WriteLine(json);
}
}
输出:
{
"method": "submit",
"params": [
{
"secret": "snL7AcZbKsHm1H7VjeZg7gNS55Xkd",
"tx_json": {
"Account": "rHSqhmuevNJg9ZYpspYHNnQDxraozuCk5p",
"TransactionType": "PaymentChannelCreate",
"Amount": "1000000",
"Destination": "rD6CGd2uL9DZUVDNghMqAfr8doTzKbEtGA",
"SettleDelay": 86400,
"PublicKey": "023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6",
"DestinationTag": 20170428
},
"fee_mult_max": 1000
}
]
}
我想你想做这样的事情:
string amnt = "100000000";
string json = $@"
{{
'method': 'submit',
'params': [{{
'secret': 'snL7AcZbKsHm1H7VjeZg7gNS55Xkd',
'tx_json': {{
'Account': 'rHSqhmuevNJg9ZYpspYHNnQDxraozuCk5p',
'TransactionType': 'PaymentChannelCreate',
'Amount': '{amnt}',
'Destination': 'rD6CGd2uL9DZUVDNghMqAfr8doTzKbEtGA',
'SettleDelay': 86400,
'PublicKey': '023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6',
'DestinationTag': 20170428
}},
'fee_mult_max': 1000
}}]
}}";
$ 符号 用于插入字符串,您可以在这里阅读更多内容:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated
此外,如果您有对象,可以考虑使用 JSON.NET
你需要在amnt+
之后,在开始的时候,把@符号放两次
string amnt = "100000000";
string json = @"
{
'method': 'submit',
'params': [{
'secret': 'snL7AcZbKsHm1H7VjeZg7gNS55Xkd',
'tx_json': {
'Account': 'rHSqhmuevNJg9ZYpspYHNnQDxraozuCk5p',
'TransactionType': 'PaymentChannelCreate',
'Amount': '"+amnt+@"', //change here
'Destination': 'rD6CGd2uL9DZUVDNghMqAfr8doTzKbEtGA',
'SettleDelay': 86400,
'PublicKey': '023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6',
'DestinationTag': 20170428
},
'fee_mult_max': 1000
}]
}";
如此处所述
@ 将字符串标记为逐字字符串文字 - 忽略字符串中通常被解释为转义序列的任何内容。所以在 amnt+ 之后添加额外的 @ 表明这是一个多行字符串。
迄今为止的最佳答案来自 Sujit.Warrier
但是旧的替换也很好
string amnt = "100000000";
string json = @"
{
'method': 'submit',
'params': [{
'secret': 'snL7AcZbKsHm1H7VjeZg7gNS55Xkd',
'tx_json': {
'Account': 'rHSqhmuevNJg9ZYpspYHNnQDxraozuCk5p',
'TransactionType': 'PaymentChannelCreate',
'Amount': '{amnt}',
'Destination': 'rD6CGd2uL9DZUVDNghMqAfr8doTzKbEtGA',
'SettleDelay': 86400,
'PublicKey': '023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6',
'DestinationTag': 20170428
},
'fee_mult_max': 1000
}]
}";
MessageBox.Show( json.Replace("{amnt}", amnt));
我正在 json-rpc 中编写程序,我想在 json 字符串中声明字符串变量 我在声明它时犯了错误,不知道那里的正确格式是什么谁能解决这个问题。
(string amnt= "1000000"
我要声明在json单引号内)
string amnt = "100000000";
string json = @"
{
'method': 'submit',
'params': [{
'secret': 'snL7AcZbKsHm1H7VjeZg7gNS55Xkd',
'tx_json': {
'Account': 'rHSqhmuevNJg9ZYpspYHNnQDxraozuCk5p',
'TransactionType': 'PaymentChannelCreate',
'Amount': '"+amnt+"',
'Destination': 'rD6CGd2uL9DZUVDNghMqAfr8doTzKbEtGA',
'SettleDelay': 86400,
'PublicKey': '023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6',
'DestinationTag': 20170428
},
'fee_mult_max': 1000
}]
}";
立即问题是你有两个字符串文字:一个逐字字符串文字在开头,然后是常规字符串字面值 与amnt
字符串连接后。为了使查看更简单,您有:
string text = @"some text
more text" + amnt + "more text
more text";
第二个字符串文字是常规字符串文字,这意味着它不能跨越多行。这就是您目前收到错误消息的原因。
这不是您遇到的唯一问题:
- 你现在生成的JSON无论如何都是无效的,因为所有这些单引号都应该是双引号。虽然几个 JSON 解析器将允许单引号,但这确实违反了 RFC 7159
- 将所有内容都放在字符串文字中是一种非常脆弱的生成方式JSON。很容易犯一个小错字并最终导致 JSON. 无效
这里有几个选项:
- 您可以使用逐字 interpolated 字符串文字,允许您使用
{amnt}
编写单个文字以包含其中的值。缺点是您需要将所有大括号加倍以表明您想要真正的大括号 - 您可以使第二个字符串文字成为逐字字符串文字,方法是在其开头添加
@
- 您可以避免在字符串中执行所有这些操作,并使用 JSON 库来生成 JSON.
我 肯定会 选择最后一个选项 - 我会使用 Json.NET.
在 Json.NET 中有很多方法可以做到这一点。例如:
- 您可以在常规 类 中为 JSON 对象建模,并序列化那些 类 的实例。如果您不止一次需要这个 JSON,我会这样做。这将允许您为属性使用惯用的 C# 名称,使用特性来指定这些属性应如何在 JSON. 中表示
- 您可以使用 LINQ to JSON 创建
JObject
和JArray
个实例。 - 您可以使用匿名类型。
这是后一种方法的示例:
using System;
using Newtonsoft.Json;
class Test
{
public static void Main()
{
string amount = "1000000";
var obj = new
{
method = "submit",
// Note: @ is required as params is a keyword
@params = new[]
{
new
{
secret = "snL7AcZbKsHm1H7VjeZg7gNS55Xkd",
tx_json = new
{
Account = "rHSqhmuevNJg9ZYpspYHNnQDxraozuCk5p",
TransactionType = "PaymentChannelCreate",
Amount = amount,
Destination = "rD6CGd2uL9DZUVDNghMqAfr8doTzKbEtGA",
SettleDelay = 86400,
PublicKey = "023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6",
DestinationTag = 20170428
},
fee_mult_max = 1000
}
}
};
string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
Console.WriteLine(json);
}
}
输出:
{
"method": "submit",
"params": [
{
"secret": "snL7AcZbKsHm1H7VjeZg7gNS55Xkd",
"tx_json": {
"Account": "rHSqhmuevNJg9ZYpspYHNnQDxraozuCk5p",
"TransactionType": "PaymentChannelCreate",
"Amount": "1000000",
"Destination": "rD6CGd2uL9DZUVDNghMqAfr8doTzKbEtGA",
"SettleDelay": 86400,
"PublicKey": "023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6",
"DestinationTag": 20170428
},
"fee_mult_max": 1000
}
]
}
我想你想做这样的事情:
string amnt = "100000000";
string json = $@"
{{
'method': 'submit',
'params': [{{
'secret': 'snL7AcZbKsHm1H7VjeZg7gNS55Xkd',
'tx_json': {{
'Account': 'rHSqhmuevNJg9ZYpspYHNnQDxraozuCk5p',
'TransactionType': 'PaymentChannelCreate',
'Amount': '{amnt}',
'Destination': 'rD6CGd2uL9DZUVDNghMqAfr8doTzKbEtGA',
'SettleDelay': 86400,
'PublicKey': '023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6',
'DestinationTag': 20170428
}},
'fee_mult_max': 1000
}}]
}}";
$ 符号 用于插入字符串,您可以在这里阅读更多内容:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated
此外,如果您有对象,可以考虑使用 JSON.NET
你需要在amnt+
之后,在开始的时候,把@符号放两次string amnt = "100000000";
string json = @"
{
'method': 'submit',
'params': [{
'secret': 'snL7AcZbKsHm1H7VjeZg7gNS55Xkd',
'tx_json': {
'Account': 'rHSqhmuevNJg9ZYpspYHNnQDxraozuCk5p',
'TransactionType': 'PaymentChannelCreate',
'Amount': '"+amnt+@"', //change here
'Destination': 'rD6CGd2uL9DZUVDNghMqAfr8doTzKbEtGA',
'SettleDelay': 86400,
'PublicKey': '023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6',
'DestinationTag': 20170428
},
'fee_mult_max': 1000
}]
}";
如此处所述 @ 将字符串标记为逐字字符串文字 - 忽略字符串中通常被解释为转义序列的任何内容。所以在 amnt+ 之后添加额外的 @ 表明这是一个多行字符串。
迄今为止的最佳答案来自 Sujit.Warrier
但是旧的替换也很好
string amnt = "100000000";
string json = @"
{
'method': 'submit',
'params': [{
'secret': 'snL7AcZbKsHm1H7VjeZg7gNS55Xkd',
'tx_json': {
'Account': 'rHSqhmuevNJg9ZYpspYHNnQDxraozuCk5p',
'TransactionType': 'PaymentChannelCreate',
'Amount': '{amnt}',
'Destination': 'rD6CGd2uL9DZUVDNghMqAfr8doTzKbEtGA',
'SettleDelay': 86400,
'PublicKey': '023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6',
'DestinationTag': 20170428
},
'fee_mult_max': 1000
}]
}";
MessageBox.Show( json.Replace("{amnt}", amnt));