如何在 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 创建 JObjectJArray 个实例。
  • 您可以使用匿名类型。

这是后一种方法的示例:

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

https://bridge.net/jsonnet

你需要在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));