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

56

我遇到了一个问题,无法将这个JSON字符串存储到变量中。我一定是错过了什么愚蠢的东西。

private string someJson = @"{
    "ErrorMessage": "",
    "ErrorDetails": {
        "ErrorID": 111,
        "Description": {
            "Short": 0,
            "Verbose": 20
        },
        "ErrorDate": ""
    }
}";

7
在内容中将双引号 " 替换为两个双引号 ""。 - csharpwinphonexaml
9
我认为你只是喝了太多咖啡了......我们都有过这种经历...... - Kevin
1
这里还有友好手册的相关部分供参考:http://msdn.microsoft.com/zh-cn/library/362314fe.aspx - Jon
1
@CoffeeAddict,@符号可以转义所有内容,但不包括引号的转义序列:http://msdn.microsoft.com/en-us/library/aa691090(v=vs.71).aspx - Robert H
1
@Clark,我在想verdesrobert是什么意思,它不是JS,但你知道吗?我将其存储为JSON,所以使用单引号应该没问题。我不确定JavascriptSerializer在尝试使用单引号反序列化时是否会关注它,还没有尝试过,也许这并不重要。 - PositiveGuy
显示剩余6条评论
8个回答

78

如果你使用@符号,则必须转义双引号,否则在第一个双引号后无法使用\作为转义符号。因此有两个选项:

不使用@并使用\转义双引号

string someJson = "{\"ErrorMessage\": \"\",\"ErrorDetails\": {\"ErrorID\": 111,\"Description\":{\"Short\": 0,\"Verbose\": 20},\"ErrorDate\": \"\"}}";

或使用双引号

string someJson =@"{""ErrorMessage"": """",""ErrorDetails"": {""ErrorID"": 111,""Description"": {""Short"": 0,""Verbose"": 20},""ErrorDate"": """"}}";

最好的方法是使用 Json.net,请查看这里 - Shaiju T
2
是的,最简单的方法就是在线转换。您可以访问https://tools.knowledgewalls.com/jsontostring 进行转换。 - Yuliia Serhiienko
我还编写了一个转换器,使用双引号语法来转义C#中的JSON字符串。https://json-to-c-sharp.ndolestudio.com/ - Arnold Ewin

21

首先,我要说的是:为此,在 JSON 数据块中,我喜欢使用单引号。

但是,很大程度上取决于您要如何声明 string 变量。

string jsonBlob = @"{ 'Foo': 'Bar' }";
string otherBlob = @"{ ""Foo"": ""Bar"" }";

...这是一个ASCII编码字符串,并且应该与单引号兼容。您可以使用双重双引号转义序列来转义双引号,但是单引号设置更加清晰。请注意,在这种情况下,“\”无法使用。

string jsonBlob = "{ 'Foo': 'Bar' }";
string otherBlob = "{ \"Foo\": \"Bar\" }";

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

由此可见,使用单引号JSON字面值不会受到正在使用的C#字符串编码的影响。这就是为什么我说,在硬编码的JSON块中使用单引号比双引号更好-它们更少的工作量,更易读。


13
使用单引号可能有效,但并不是一个好主意,因为它不是JSON标准的一部分。标准要求使用双引号。 - Timigen
1
其他平台和代码检查工具不接受单引号。例如,jQuery在我上次检查时无法解析带有单引号的JSON。 - gerrard00
2
@Timigen。.NET生态系统已经到位,新的System.Text.Json库不喜欢单引号,而旧的Newtonsoft.Json库则不同。 - nelsonjchen
System.Text.Json.JsonReaderException: '''' 不是一个有效的属性名称开头。需要一个 '"'。 - malat

10

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

string jsonData = string.Empty;
jsonData = File.ReadAllText(@"\UISettings.json");

5

从.NET 7开始支持的C# 11版本,可以通过使用三引号字符将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; }
    }
}

5

这对于一组相当大的测试数据非常有效 - 谢谢分享 - 333Matt

5

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

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

4
在C#字符串中编写JSON有些笨拙,因为JSON标准需要使用双引号,而这些引号需要在C#中进行转义,如其他答案所示。一种优雅的解决方法是使用C# dynamic和来自JSON.Net的JObject。
dynamic message = new JObject();
message.ErrorMessage = "";
message.ErrorDetails = new JObject();
message.ErrorDetails.ErrorId = 111;
message.ErrorDetails.Description = new JObject();
message.ErrorDetails.Description.Short = 0;

Console.WriteLine(message.ToString());

// Ouputs:
// { 
//   "ErrorMessage": "",
//   "ErrorDetails": {
//     "ErrorID": 111,
//     "Description": {
//       "Short": 0
// .....  

请查看https://www.newtonsoft.com/json/help/html/CreateJsonDynamic.htm


-1
如果您正在使用Visual Studio,则选择整个JSON字符串,然后按crtl+f在选定内容中查找双引号,然后用""替换"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接