将JSON字符串粘贴到Visual Studio中

本文关键字:Visual Studio JSON 字符串 | 更新日期: 2023-09-27 18:27:22

我正在Visual Studio中使用从数据库中复制的JSON字符串运行一些C#单元测试,例如:

{ 
    "key" : "Foo", 
    "format" : "Bar"
}

我想将JSON字符串解析为代码中的JObject:

 JObject.Parse(
    "{ 
        "key" : "Foo", 
        "format" : "Bar"
    }");

但是,我不能这样做,因为Visual Studio不会转义字符串中的引号。

我知道我可以添加转义符,但是字符串可能很长,这意味着手动添加转义符需要很长时间。

将复制的JSON字符串解析为JObject最简单的方法是什么?

将JSON字符串粘贴到Visual Studio中

使用逐字逐句的字符串文字(MSDN),将字符串加上@。然后用双引号(")替换引号(")

这比使用反斜杠转义引号可读性高得多。

JObject.Parse(
@"{ 
    ""key"" : ""Foo"", 
    ""format"" : ""Bar""
}");

ReSharper可以无缝完成,但当然要花钱。

还有一个免费的VS扩展可以做到这一点,在这里:https://marketplace.visualstudio.com/items?itemName=martinw.SmartPaster2013

对于使用大量JSON的测试,我喜欢将它们存储在嵌入项目DLL的".JSON"文件中。

请注意,您需要使用System.Reflection才能正常工作。

public string GetFileFromManifest(string path){
    using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(path))
    {
        stream.Position = 0;
        using (var streamReader = new StreamReader(stream))
        {
            return streamReader.ReadToEnd();
        }
    }
}

使用DLL路径调用,即:

GetFileFromManifest("The.Name.Of.The.Dll.FolderNameOfEmbeddedFiles.Filename.json");

GetManifestResourceStream的文档:https://msdn.microsoft.com/en-us/library/xc4235zt(v=vs.110).aspx

此外,您可以将JObject.Parse添加到该方法中,或者创建一个新方法将其作为JSON。

粘贴,突出显示所选内容,查找并替换"for"

将JSON放入某个目录(例如TestData/data.json)中的专用.JSON文件中,并将文件内容加载为字符串。请确保将data.json的文件属性设置为Copy to output directory

// File Loader
public static class ReadJsonFile
{
    public static string GetFileFromDisk(string path)
    {
        var absPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
        return File.ReadAllText(absPath + path);
    }
}

// Call the loader
var resultString = ReadJsonFile.GetFileFromDisk("/TestData/data.json");
JObject.Parse(resultString);

这更干净,可以避免与大型JSON字符串混淆。这可能是一种痛苦。

{"键":"Foo";,"格式":"条形图";}

你可以做的一件事就是使用匿名对象。

var obj = new { key = "Foo", format = "Bar };
var json = JsonConvert.SerializeObject(obj);
var jsonObject = JsonConvert.DeserializeObject(json);