如何通过命令行C#从传递的字符串中获取JSON

问题描述

我这样做是有原因的。这是我下一步应用程序所需要的。我正在创建Visual Studio扩展,我需要它来在插件和项目之间进行通信。

我在Visual Studio中将json字符串作为命令行参数传递。

当我从控制台加载该字符串时,由于缺少某些json字符,因此无法进行反序列化。

我作为arg粘贴到控制台的内容是:

{"lastModifiedDate":"2020-07-13T08:06:01Z","model":{"softwareSystems":[{"containers":[{"components":[{"location":0,"relationships":[{"sourceId":9,"destinationId":11,"technology":"","id":14,"name":null,"description":"","tags":"Relationship","tagsList":[]}],"id":9,"name":"system1 container1 component1","tags":"Element,Component","tagsList":[]},{"location":0,"relationships":[{"sourceId":10,"destinationId":9,"id":16,"id":10,"name":"system1 container1 component2","location":0,"relationships":[{"sourceId":5,"destinationId":8,"id":13,"id":5,"name":"system1 container1",Container",{"components":[{"location":0,"relationships":[],"id":11,"name":"system2 container1 component1","relationships":[{"sourceId":6,"destinationId":5,"id":15,"id":6,"name":"system1 container2","relationships":[{"sourceId":2,"destinationId":4,"id":12,{"sourceId":2,"destinationId":7,"id":20,"id":2,"name":"Software System1","description":"My software system.",Software System",{"containers":[{"components":[],"relationships":[{"sourceId":7,"destinationId":6,"id":17,"id":7,"name":"system2 container2",{"components":[],"relationships":[{"sourceId":8,"id":21,"id":8,"name":"system2 container1","id":4,"name":"Software System2","people":[{"location":0,"relationships":[{"sourceId":1,"destinationId":2,"id":3,"description":"Uses","tags":"Relationship,Synchronous",{"sourceId":1,"id":18,"id":19,"id":1,"name":"User","description":"A user of my software system.",Person","lastId":0},"views":{"systemContextViews":[{"softwareSystemId":2,"description":"An example of a System Context diagram.","configuration":{"styles":null},"elements":[{"id":4,"x":305,"y":300},{"id":1,"x":1255,"y":-5},{"id":2,"x":1190,"y":935}],"relationships":[{"id":3},{"id":12}]}],"containerViews":[{"softwareSystemId":2,"elements":[{"id":5,"x":110,"y":215},{"id":6,"x":1875,"y":715}],"relationships":[{"id":15}]},{"softwareSystemId":4,"elements":[{"id":8,"x":175,"y":224},{"id":7,"x":1845,"y":720}],"relationships":[{"id":21}]}],"componentViews":[{"containerId":5,"elements":[{"id":9,"x":120,"y":80},{"id":10,"x":1880,"y":1105},{"id":11,"x":130,"y":1000},"x":1760,"y":120}],"relationships":[{"id":14},{"id":16},{"id":18}]}]},"id":0,"name":"Demo workspace","description":"A demo workspace.","tags":"ElementBase,Workspace","tagsList":[]}

从控制台我得到

"{lastModifiedDate:2020-07-13T08:06:01Z,model:{softwareSystems:[{containers:[{components:[{location:0,relationships:[{sourceId:9,destinationId:11,technology:,id:14,name:null,description:,tags:Relationship,tagsList:[]}],id:9,name:system1 container1 component1,tags:Element,Component,tagsList:[]},{location:0,relationships:[{sourceId:10,destinationId:9,id:16,id:10,name:system1 container1 component2,location:0,relationships:[{sourceId:5,destinationId:8,id:13,id:5,name:system1 container1,Container,{components:[{location:0,relationships:[],id:11,name:system2 container1 component1,relationships:[{sourceId:6,destinationId:5,id:15,id:6,name:system1 container2,relationships:[{sourceId:2,destinationId:4,id:12,{sourceId:2,destinationId:7,id:20,id:2,name:Software System1,description:My software system.,Software System,{containers:[{components:[],relationships:[{sourceId:7,destinationId:6,id:17,id:7,name:system2 container2,{components:[],relationships:[{sourceId:8,id:21,id:8,name:system2 container1,id:4,name:Software System2,people:[{location:0,relationships:[{sourceId:1,destinationId:2,id:3,description:Uses,Synchronous,{sourceId:1,id:18,id:19,id:1,name:User,description:A user of my software system.,Person,lastId:0},views:{systemContextViews:[{softwareSystemId:2,description:An example of a System Context diagram.,configuration:{styles:null},elements:[{id:4,x:305,y:300},{id:1,x:1255,y:-5},{id:2,x:1190,y:935}],relationships:[{id:3},{id:12}]}],containerViews:[{softwareSystemId:2,elements:[{id:5,x:110,y:215},{id:6,x:1875,y:715}],relationships:[{id:15}]},{softwareSystemId:4,elements:[{id:8,x:175,y:224},{id:7,x:1845,y:720}],relationships:[{id:21}]}],componentViews:[{containerId:5,elements:[{id:9,x:120,y:80},{id:10,x:1880,y:1105},{id:11,x:130,y:1000},x:1760,y:120}],relationships:[{id:14},{id:16},{id:18}]}]},id:0,name:Demo workspace,description:A demo workspace.,tags:ElementBase,Workspace,tagsList:[]}"

您会看到“ {”,双引号丢失了。

我如何从控制台获取字符串:

string[] commandLineArgs = Environment.GetCommandLineArgs();

我需要可以转换为相同形式的方法,因为字符串会有所不同

您知道如何解决我的问题吗?

解决方法

c:\> myapp.exe "{\"asdf\":\"x yz\",\"xyz\": 3}"

为我工作(在Win10上,目前无法测试其他版本)。

使用\转义属于JSON字符串的所有双引号。然后用双引号将整个json对象括起来以将空格括起来,以使字符串不会在多个参数上分割。

编辑

作为替代方案,如果您负责创建和接收json字符串,则可以使用更“ CMD友好”的格式,例如Base64。这样,您就不必在命令行上处理空格,引号或其他特殊字符

在发电侧:

var someobject = new {key1 = "value1",key2 = 3};
var json = Newtonsoft.Json.JsonConvert.SerializeObject(someobject);
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
var base64 = System.Convert.ToBase64String(plainTextBytes);
// base64 will look something like
// eyJrZXkxIjogInZhbHVlMSIsICJrZXkyIjogM30= 
// depending on the formatting of the serialization

然后将base64作为参数传递到命令行。

C:\>someapp.exe eyJrZXkxIjogInZhbHVlMSIsICJrZXkyIjogM30=

在接收方做

var base64 = Environment.GetCommandlineArgs()[1];
var base64EncodedBytes = System.Convert.FromBase64String(base64);
var json = System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
var someObject = Newtonsoft.Json.JsonConvert.DeserializeObject(json);
,

要转义双引号(“),请使用两次。因此,当您将”“传递给命令时,它将被接收为”。 例如,将数据传递为: ConsoleAppTest.exe“ {”“ lastModifiedDate”“:”“ 2020-07-13T08:06:01Z”“,”“模型”“:”“软件系统”“}”

请参考以下类似答案:

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...