Как написать строку c # в одинарных кавычках json - PullRequest
0 голосов
/ 06 июня 2018

Я пишу программу в 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
}]

        }";

Ответы [ 4 ]

0 голосов
/ 06 июня 2018

Лучший ответ пока от 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));
0 голосов
/ 06 июня 2018

Я думаю, вы хотите сделать что-то вроде этого:

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

https://bridge.net/jsonnet

0 голосов
/ 06 июня 2018

вам нужно ставить символ @ дважды в начале, один раз после 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
      }]

    }";

, как указано здесь https://stackoverflow.com/a/556142/1322204 @ помечает строку как дословный строковый литерал - все, что в строкеобычно интерпретируется как escape-последовательность игнорируется.поэтому добавление лишнего @ после amnt + говорит о том, что это многострочная строка.

0 голосов
/ 06 июня 2018

Непосредственная проблема состоит в том, что у вас есть два строковых литерала: дословный строковый литерал в начале, а затем обычный строковый литерал послеконкатенация строк с 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
    }
  ]
}
...