Задать вопрос

Как генерировать Json на C#, если структура динамическая, не прописывая все возможные варианты?

Я генерирую json с помощью библиотеки Newtonsoft.Json;
Ответ должен быть типа
{Command:"CommandName", Data:{"Param1":1,"Param2:2"}}

Всегда будет структура Command и Data, но содержимое разное. Но и структура Data тоже разная.
Как организовать структуру, что б если Command="команда 1", то генерировалось по одному сценарию, а если другая- то по-другому?

Например:

{Command:"FilesList", Data:{"Files":["file1","file2","file3","file4"]}}
{Command:"UserInfo", Data:{"UserId":1, "UserName": "Roman" ....}}

Тоесть- я создам соответствующие классы FilesList,UserInfo, а вот как передать "неопределённый" класс? или делать перегрузки метода? Может как-то описать базовый класс, где будет Command и Data и как-то в Data засовывать соответвтвующие классы и потом генерировать json? Так я создаю json.

string data = JsonConvert.SerializeObject(DataInfo, Formatting.Indented);
  • Вопрос задан
  • 928 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
yamaoto
@yamaoto
la programmeur
Можно оформить классы вот так:
public class CommandResult
{
    public string Command {get;set;}
}
public class CommandResult<T>:CommandResult
{
    public T Data {get;set;}
}
public class FilesList
{
    public string[] Files {get;set;}
}
public class UserInfo
{
    ...
}


и используешь в WebApi
public class MyAwesomeController:ApiController
{

    public CommandResult<FilesList> GetFilesList(){
        ...
        return new CommandResult<FilesList> (){
            Command = "FilesList",
            Data = new FilesList(){Files = new []{"file1","file2","file3","file4"}}
        };
    }
 public CommandResult<UserInfo> GetUserInfo(){
...
 }
}


или со своей логикой
public class MyAwesomeCommands
{

    private CommandResult<FilesList> _getFilesList(){
    ...
        return new CommandResult<FilesList> (){
            Command = "FilesList",
            Data = new FilesList(){Files = new []{"file1","file2","file3","file4"}}
        };
    }
    public string GetFilesList(){
        var data = getFilesList();
        return JsonConvert.SerializeObject(data);
    }
 public string GetUserInfo(){
...
 }
}
Ответ написан
Комментировать
@Sing303
А dynamic не устраивает?

dynamic filesListCommand = new
{
    Command = "FilesList",
    Data = new { Files = new[] { "file1", "file2", "file3", "file4" } }
};

dynamic userInfoCommand = new
{
    Command = "UserInfo",
    Data = new { UserId = 1, UserName = "Roman" }
};

string filesListCommandJson = JsonConvert.SerializeObject(filesListCommand);
string userInfoCommandJson = JsonConvert.SerializeObject(userInfoCommand);

dynamic filesListCommandParsed = JObject.Parse(filesListCommandJson);
dynamic userInfoCommandJsonParsed = JObject.Parse(userInfoCommandJson);

string file1Value = filesListCommandParsed.Data.Files[0]; // file1
string romanValue = userInfoCommandJsonParsed.Data.UserName; // Roman
Ответ написан
Комментировать
Rou1997
@Rou1997
Я не знаю как это сделать с помощью SerializeObject, отказался от него из-за плохого быстродействия и низкой гибкости, но никто вам не мешает используя рефлексию написать самому конструкцию, которая укажет парсеру тот класс, чье имя содержится в string
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы