如何在json单引号中编写c#字符串

时间:2018-06-06 06:35:01

标签: c# asp.net json json.net json-rpc

我正在json-rpc中编写一个程序,我想在json字符串中声明字符串变量我在做错了,同时声明它不知道什么是正确的格式是有任何人可以解决这个问题。

var baItem = element( by.xpath('//div[@class="ba-object-item"][./div/h5[text()="Analog output"]]')); // or var baItem = element( by.xpath('//div[@class="ba-object-item"][.//h5[text()="Analog output"]]')); var baValue = baItem.element(by.css('div.ba-value')); var baIcon = baItem.element(by.css('i.marengo-physical-output')) 我想用单引号声明json数量)

string amnt= "1000000"

4 个答案:

答案 0 :(得分:5)

立即问题是您有两个字符串文字:一开始是逐字字符串文字,然后是常规字符串文字< / {>与amnt字符串连接后。为了让它更容易看到,你得到了:

string text = @"some text
                more text" + amnt + "more text
                more text";

第二个字符串文字是一个常规字符串文字,这意味着它不能遍历多行。这就是您此刻收到错误的原因。

这不是您所遇到的唯一的问题:

  • 您目前正在制作的JSON无论如何都是无效的,因为所有这些单引号都应该是双引号。虽然有几个JSON解析器允许单引号,但这确实违反了RFC 7159
  • 将所有内容放在字符串文字中是一种非常脆弱的JSON生成方式。制作一个小错误并最终得到无效的JSON很容易。

这里有几个选项:

  • 您可以使用逐字插值字符串文字,允许您使用{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
    }
  ]
}

答案 1 :(得分:4)

你需要在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 @将字符串标记为逐字字符串文字 - 字符串中通常被解释为转义序列的任何内容都将被忽略。所以在amnt +之后添加额外的@告诉我这是一个多行字符串。

答案 2 :(得分:0)

我想你想做这样的事情:

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
    }}]
}}";

$ symbol 用于插入字符串,您可以在此处阅读更多内容:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated

此外,如果您有对象,可以考虑使用JSON.NET

https://bridge.net/jsonnet

答案 3 :(得分:0)

到目前为止,最好的答案来自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));