/ / Кілька моделей для json - json, windows-runtime, json.net, windows-8.1

Кілька моделей для json-json, windows-runtime, json.net, windows-8.1

Чи є спосіб створити рядок json масиву з декількох моделей для Windows 8.1 Store App. Наприклад:

public class Foo
{
public string property1 {get;set;}
public string property2 {get;set;}
}

public class Foo2
{
public string value1 {get;set;}
public string value2 {get;set;}
}

У мене є кілька моделей. Я використовую json.net для перетворення моделей в рядок json. Я також можу перетворювати масиви моделей. Моє питання полягає в тому, як створити рядок json масиву за допомогою таких моделей, як:

[
{
"property1":"string",
"property2":"string"
},
{
"value1":"string",
"value2":"string"
},
{
"property1":"string",
"property2":"string"
}
]

Я дійсно застряг і потребує вашої допомоги.

Відповіді:

1 для відповіді № 1

Один із способів зробити це - створити абстрактний клас BaseFoo що обидва Foo і Foo2 класи успадкують від:

public abstract class BaseFoo
{

}

public class Foo : BaseFoo
{
public string property1 { get; set; }
public string property2 { get; set; }
}

public class Foo2 : BaseFoo
{
public string value1 { get; set; }
public string value2 { get; set; }
}

Дозволяє сказати, що ви ініціалізуєте список так:

 var list = new List<BaseFoo>
{
new Foo
{
property1 = "prop11",
property2 = "prop12"
},
new Foo2
{
value1 = "val1",
value2 = "val2"
},
new Foo
{
property1 = "prop21",
property2 = "prop22"
}
};

Серіалізація повинна виглядати так:

var settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects
};

var json = JsonConvert.SerializeObject(list, Formatting.Indented, settings);

І виробляється json виглядатиме так:

[
{
"$type": "ConsoleApplication23.Foo, ConsoleApplication23",
"property1": "prop11",
"property2": "prop12"
},
{
"$type": "ConsoleApplication23.Foo2, ConsoleApplication23",
"value1": "val1",
"value2": "val2"
},
{
"$type": "ConsoleApplication23.Foo, ConsoleApplication23",
"property1": "prop21",
"property2": "prop22"
}
]

The TypeNameHandling.Objects додано опцію для успішної десеріалізації:

var deserializedList = JsonConvert.DeserializeObject<List<BaseFoo>>(json, settings);

Ви можете виключити його і отримати точну json-рядокВам потрібно, якщо Вам не потрібно десеріалізувати його назад. Незважаючи на те, що він залишився включений, він не повинен порушувати функціональність, але збільшить розмір рядка json.