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

Jit*_*der 3 c# asp.net json json-rpc json.net

我正在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
}]

        }";
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

直接的问题是,你有两个字符串文字:一个逐字字符串的开始,然后一个常规字符串文字字符串连接与后amnt.为了使它更容易看到,你有:

string text = @"some text
                more text" + amnt + "more text
                more text";
Run Code Online (Sandbox Code Playgroud)

第二个字符串文字是一个常规的字符串文字,这意味着它不能超过多行.这就是为什么你现在收到错误的原因.

这不是你遇到的唯一问题:

  • 您目前生成的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

{
  "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
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)