Непосредственная проблема состоит в том, что у вас есть два строковых литерала: дословный строковый литерал в начале, а затем обычный строковый литерал послеконкатенация строк с amnt
.Чтобы было проще видеть, у вас есть:
string text = @"some text
more text" + amnt + "more text
more text";
Этот второй строковый литерал является обычным строковым литералом, что означает, что он не может проходить через несколько строк.Вот почему вы получаете сообщение об ошибке.
Это не проблема only , которая у вас есть:
- JSON, который вы создаетена данный момент все равно недействительно, так как все эти одинарные кавычки должны быть двойными.Хотя несколько парсеров JSON допускают одинарные кавычки, это нарушает RFC 7159
- Помещение всего в строковые литералы - очень хрупкий способ создания JSON.Очень легко сделать небольшую опечатку и получить неверный JSON.
Здесь есть несколько вариантов:
- Вы можете использовать дословно интерполированный строковый литерал, позволяющий написать один литерал с
{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
}
]
}