2015-08-17 27 views
2

我正在尝试创建一个Web API,它将powershell命令的输出转换为JSON。 有谁知道可以做到这一点或将PSObject转换为JSON的库? PSObject属性根据生成它的命令而改变。 我试图将PSObject传递给“ConvertTo-Json”,但我得到了额外的对象信息。在PS中将PSObject(或PS命令)转换为JSON#

PS命令​​:Get-Process |选择 - 属性句柄,ProcessName |的ConvertTo JSON的

JsonConvert.SerializeObject后的输出():

"{\"CliXml\":\"<Objs Version=\\\"1.1.0.1\\\" xmlns=\\\"http://schemas.microsoft.com/powershell/2004/04\\\">\\r\\n <Obj RefId=\\\"0\\\">\\r\\n<TN RefId=\\\"0\\\">\\r\\n <T>System.String</T>\\r\\n  <T>System.Object</T>\\r\\n </TN>\\r\\n <ToString>[_x000D__x000A_ {_x000D__x000A_\\\"Handles\\\":163,_x000D__x000A_\\\"ProcessName\\\":\\\"AppleMobileDeviceService\\\"_x000D__x000A_},_x000D__x000A_ {_x000D__x000A_\\\"Handles\\\": 972,_x000D__x000A_\\\"ProcessName\\\":\\\"CcmExec\\\"_x000D__x000A_},_x000D__x000A_{_x000D__x000A_\\\"Handles\\\": 1838,_x000D__x000A_\\\"ProcessName\\\":\\\"ccSvcHst\\\"_x000D__x000A_}" 

PS命令​​的BeginInvoke。 PS命令​​:Get-Process |选择-Property把手,ProcessName JsonConvert.SerializeObject(PSObj)后的输出:

"[{\"CliXml\":\"<Objs Version=\\\"1.1.0.1\\\" xmlns=\\\"http://schemas.microsoft.com/powershell/2004/04\\\">\\r\\n <Obj RefId=\\\"0\\\">\\r\\n <TN RefId=\\\"0\\\">\\r\\n  <T>Selected.System.Diagnostics.Process</T>\\r\\n  <T>System.Management.Automation.PSCustomObject</T>\\r\\n  <T>System.Object</T>\\r\\n </TN>\\r\\n <ToString>@{Handles=163; ProcessName=AppleMobileDeviceService}</ToString>\\r\\n <Obj RefId=\\\"1\\\">\\r\\n  <TNRef RefId=\\\"0\\\" />\\r\\n  <MS>\\r\\n  <I32 N=\\\"Handles\\\">163</I32>\\r\\n  <S N=\\\"ProcessName\\\">AppleMobileDeviceService</S></Objs>\"}}] 
+1

'ConvertTo-JSON'听起来就像你在做什么后...什么是额外的属性?如果你想删除属性,你可以使用select-object在转换为json之前指定你刚才的属性。 – JohnLBevan

+0

这并没有工作更新与数据的职位。 – RDs

回答

1

如果你使用第三方库OK,然后JSON.NETJsonConvert类。使用相当简单:JsonConvert.SerializeObject(myObj)将返回一个包含JSON的字符串。

我觉得这比试图以编程方式从C#代码调用Powershell容易一些。

如果您想要省略其他属性,那么JsonConvert允许您实现IContractResolver来指定您想要的属性。

它结束了看起来像这样:

JsonConvert.SerializeObject(myObj, new JsonSerializerSettings { ContractResolver = new MyContractResolver() }); 

而且ContractResolver看起来像这样:

public class MyContractResolver : DefaultContractResolver 
{ 
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) 
    { 
     IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization); 
     properties = properties.Where(p => p.PropertyName != "OmittedProperty").ToList(); 
     return properties; 
    } 
} 

当然,你可以为属性任何你喜欢的状态。

+0

这没有奏效,用数据更新了帖子。 – RDs

+1

请记住,在Visual Studio中检查字符串时,它将添加前导和尾随引号以及转义引号和反斜杠。所以“和\分别显示为\”和\\。这是你注意到输出的问题吗? – Tonkleton

+0

我会检查你发布的代码。感谢您的帮助。这不只是在VS.我将数据输出到控制台窗口,然后还将数据输出到网络浏览器,并看到相同的问题。 – RDs