Как преобразовать строку JSON в PSObject?

Я хочу написать функцию PowerShell на C#. В процессе я получаю строку с содержимым JSON. Мой образец содержимого json:

string json = "{'TestNr':{'Name':'CSHARP', 'Description':'Test Descriptiopn'}}"

Эта строка должна быть преобразована в PSObject точно так же, как ConvertFrom-Json.

Я пытался создать объект с линиями ниже. Это работает, но потребует большого количества ручных сценариев, особенно если строка JSON станет длиннее.

PSObject obj = new PSObject();
obj.Properties.Add(new PSNoteProperty("Head", "Children"));

Я также попробовал следующую строку:

obj = (PSObject)TypeDescriptor.GetConverter(typeof(PSObject)).ConvertFromString(json);

Однако для этого я получаю ошибку (я запускаю функцию в PowerShell 7):

TypeConverter не может преобразовать из System.String.


person Alex_P    schedule 26.02.2020    source источник
comment
var jobj = JObject.Parse(json); преобразует его в JObject. Я бы не стал пытаться перенести powershell в С# и начать изучать методы и процессы, которые С# дает вам для сериализации и десериализации объекта/строки json.   -  person Jawad    schedule 26.02.2020


Ответы (1)


Есть два способа разобрать строку в C#, которые проще всего использовать.

public class MyClass
{
    public TestNRClass TestNR { get; set; }
}

public class TestNRClass
{
    public string Name { get; set; }
    public string Description { get; set; }
}

// In the main,
string json = @"{""TestNr"":{""Name"":""CSHARP"", ""Description"":""Test Descriptiopn""}}";

MyClass jobj = JsonConvert.DeserializeObject<MyClass>(json);
Console.WriteLine(jobj.TestNR.Name);

Это с объектом строго типизированного класса. Это то, что вы должны использовать в С#.

Другой способ - получить объект

string json = @"{""TestNr"":{""Name"":""CSHARP"", ""Description"":""Test Descriptiopn""}}";

JObject obj = JObject.Parse(json);
Console.WriteLine(obj.ToString());
Console.WriteLine(obj["TestNr"]["Name"].ToString());

// You can also add more keyValuePair
obj["NewVariable"] = "stest";
Console.WriteLine(obj.ToString()); // Shows the new item as well.
person Jawad    schedule 26.02.2020