将硬编码的JSON字符串存储到变量

Pos*_*Guy 25 c# json

我在将这个json字符串存储到变量时遇到了问题.这是我在这里失踪的傻事

private string someJson = @"{
    "ErrorMessage": "",
    "ErrorDetails": {
        "ErrorID": 111,
        "Description": {
            "Short": 0,
            "Verbose": 20
        },
        "ErrorDate": ""
    }
}";
Run Code Online (Sandbox Code Playgroud)

小智 47

如果使用@符号,它必须转义"s",它不允许\在第一个之后用作转义符号.所以这两个选项是:

不要使用@并使用\来逃避"

string someJson = "{\"ErrorMessage\": \"\",\"ErrorDetails\": {\"ErrorID\": 111,\"Description\":{\"Short\": 0,\"Verbose\": 20},\"ErrorDate\": \"\"}}";
Run Code Online (Sandbox Code Playgroud)

或使用双引号

string someJson =@"{""ErrorMessage"": """",""ErrorDetails"": {""ErrorID"": 111,""Description"": {""Short"": 0,""Verbose"": 20},""ErrorDate"": """"}}";
Run Code Online (Sandbox Code Playgroud)

  • 是的,最简单的方法就是在线转换 https://tools.knowledgewalls.com/jsontostring (2认同)

And*_*ray 12

首先,我会把它扔出去:因为这个原因,在JSON blobs中,我喜欢使用单引号.

但是,很大程度上取决于你将如何声明你的string变量.

string jsonBlob = @"{ 'Foo': 'Bar' }";
string otherBlob = @"{ ""Foo"": ""Bar"" }";
Run Code Online (Sandbox Code Playgroud)

...这是一个ASCII编码的字符串,它应该与单引号很好地配合使用.您可以使用双重双引号转义序列来转义双精度数,但单引号设置更清晰.请注意,"在这种情况下不起作用.

string jsonBlob = "{ 'Foo': 'Bar' }";
string otherBlob = "{ \"Foo\": \"Bar\" }";
Run Code Online (Sandbox Code Playgroud)

...此声明使用C#的默认字符串编码Unicode.请注意,您必须使用双引号的斜杠转义序列 - 双倍不会起作用 - 但单个不受影响.

从中可以看出,单引号JSON文字不受正在使用的C#字符串编码的影响.这就是为什么我说单引号在硬编码的JSON blob中使用比使用双精度更好 - 它们工作量少,可读性更强.

  • 使用单引号是可以的,并且最有可能工作,但它不是一个好主意,因为它不是JSON标准的一部分.标准要求双引号. (8认同)
  • @蒂米根。.NET 生态系统本身现在已经成熟,较新的“System.Text.Json”库不喜欢单引号,这与旧的“Newtonsoft.Json”库不同。 (2认同)

小智 8

简单的方法是将 JSON 复制到 .json 文件并在代码中读取该文件

string jsonData = string.Empty;
jsonData = File.ReadAllText(@"\UISettings.json");
Run Code Online (Sandbox Code Playgroud)


kra*_*ego 6

本末倒置的解决方案是将匿名类序列化为字符串:

var someJson = JsonConvert.SerializeObject(
   new
    {
        ErrorMessage = "",
        ErrorDetails = new
        {
            ErrorID = 111,
            Description = new
            {
                Short = 0,
                Verbose = 20
            },
            ErrorDate = ""
        }
    });
Run Code Online (Sandbox Code Playgroud)


Ach*_*old 5

我也遇到了同样的问题,我最终编写了一个开源在线转换器,它接受 JSON 字符串并使用双引号语法吐出 C# excaped 字符串。所以

{ "foo":"bar"}
Run Code Online (Sandbox Code Playgroud)

将被逃逸到

var jsonString = @"{ ""foo"":""bar""}";
Run Code Online (Sandbox Code Playgroud)


小智 5

从 .NET 7 支持的C# 11开始,可以通过将 JSON 字符串括在三引号字符中来嵌入不进行任何修改的 JSON 字符串,该功能称为原始字符串文字( learn.microsoft.com )。相关的有用语言功能是StringSyntaxAttribute,它允许 Visual Studio 识别字符串变量是 JSON 字符串并突出显示任何拼写错误。一个样品:

using System.Diagnostics.CodeAnalysis;
using System.Text.Json;

internal class Program
{
    [StringSyntax(StringSyntaxAttribute.Json)]
    private const string myCountry = """{"Name": "Slovakia", "CountryCode": 421}""";

    private static void Main(string[] args)
    {
        var _ = JsonSerializer.Deserialize<Country>(myCountry);
    }

    class Country
    {
        public string Name { get; set; } = default!;
        public int CountryCode { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)