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

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

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

        }";

最佳答案

直接 问题是您有两个字符串文字:一个verbatim 字符串文字 在开头,然后是一个常规字符串文字 在字符串与 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
    }
  ]
}

关于c# - 如何在json单引号中编写c#字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50713665/

相关文章:

c# - 检测何时在 Windows 窗体的标题栏中按下帮助按钮?

asp.net - FullCalendar 显示太多周数

asp.net - 更改 stub 代码后面的初始 Visual Studio 代码?

java - 如何在 Java 中从 URL 获取 json 数据而不丢失空格?

c# - 如何确定我的应用程序是否处于事件状态(有焦点)

c# - 正则表达式来获取样本的特定部分

java - 将 Json 转换为列表

javascript - JSON 到多个 HTML 表

c# - 为什么 .NET Math.Round 方法在处理负值时四舍五入而不是四舍五入?

asp.net - 使用 IIS 和个人证书在本地开发时如何避免出现 "Not Secure"消息?