2015-10-14 5 views
0

Я работаю над самообслуживанием rest api, используемым для контроля состояния нескольких серверов.Building json response

мне было поручено, что, когда все работает правильно, я должен вернуться только

{"response":"ok"} 

Но, когда есть ошибка на запрашиваемом сервере или серверах, я должен вернуться

{ "response" : [ {"agent":"<server>:<port>","port":"<port>" ,"Error":"<Description of the error>"} ] } 

I подумывал о создании вспомогательного класса для создания объекта по этой схеме и возвращения их по остальной части api

public class HelperErrorResponseClass 
{ 
    public string agent { get; set; } 
    public string port { get; set; } 
    public string Error { get; set; } 
} 

Это не проблема, проблема в том, как бороться, когда все в порядке. У меня есть этот ответ Api вспомогательный класс

public class Response 
{ 
    public string response { get; set; } 
} 

Но я вижу, что мне нужно изменить свойство ответа на List<HelperErrorResponseClass> для того, чтобы отправить ошибочный ответ. Считаете ли вы, что если я строю объект List<HelperErrorResponseClass> с Json.Net, он будет возвращен в желаемом формате?

Редактировать: Забыл добавить это, I-m используя веб-Api для создания службы отдыха.

UDPATE:

После дальнейших исследований, я нашел способ решить эту проблему.

После this post, я был в состоянии переписать вспомогательные классы как этот

[DataContract] 
[KnownType(typeof(List<HelperErrorResponseClass>))] 
public class Response 
{ 
    [DataMember] 
    public object response { get; set; } 
} 

[DataContract] 
public class HelperErrorResponseClass 
{ 
    [DataMember(EmitDefaultValue = false)] 
    public string agent { get; set; } 
    [DataMember(EmitDefaultValue = false)] 
    public string port { get; set; } 
    [DataMember(EmitDefaultValue = false)] 
    public string error { get; set; } 
} 

Эту работу, чтобы выполнить мои и нуждается мой клиент ... для одной маленькой вещи, за исключением. Когда я получаю результат из списка, и учитывая, что я добавил KnownTypes директивы, мой ответ сейчас это

{"response":[{"__type":"HelperErrorResponseClass:#AppCommonLib","Error":"ERROR","InstanceId":"<InstanceId> : <Port>","PortType":"<PortType>"},{"__type":"HelperErrorResponseClass:#AppCommonLib","Error":"ERROR","InstanceId":"<InstanceId> : <Port>","PortType":"<PortType>"}]} 

Любой идея, как избавиться от этой __type имущества ответа? что он должен быть явным, чтобы возвращать объявленные свойства класса-помощника?

+1

Я не использовал Json.Net, но он должен иметь возможность правильно форматировать список. Что вы не можете попробовать и посмотреть? Я использую ServiceStack.Text, и он отлично работает. –

+0

@ RacilHilan, попробуй. Я опубликовал эти минуты, прежде чем я вышел из офиса, и хотел узнать ваше мнение, прежде всего, о том, что вы делаете в – CJLopez

ответ

1

Простейший способ справиться с этим - установить тип возвращаемого значения для функции обработки в строку, затем вы можете проверить наличие ошибок и сделать что-то вроде;

//pseudo code to give an idea 
if (errorsList.Count() > 0) 
{ 
    return JsonConvert.SerializeObject(errorsList); 
} 
else 
{ 
    return JsonConvert.SerializeObject(new Response("ok")); 
} 

Теперь это сказано ... Если люди, не соблюдающие требования, совсем не гибкие, вы должны просто переделать дизайн. Как насчет того, чтобы просто вернуть массив ошибок, и человек, вызывающий API, может сделать вывод, что если длина равна 0, тогда все работает нормально. Кажется довольно прямолинейным, не так ли? Вы также можете просто поместить все свойства на один объект, и эти поля просто вернутся как пустые или пустые строки. Или вы можете изменить настройки сериализатора, чтобы исключить их, если они не имеют значения.

+0

. Как вы уже сказали, они не настолько гибки и соответствуют тому, как они этого хотят, но я работаю с ними способ работать с ним – CJLopez

1

Держите вещи простыми и используйте анонимный тип.

if (condition) 
{ 
    return JsonConvert.SerializeObject(new { response = new { agent = "x", port = "y", error = "z" }}); 
} 
else 
{ 
    return JsonConvert.SerializeObject(new { response = "ok"}); 
} 

Подробнее:

https://msdn.microsoft.com/en-us/library/bb397696.aspx

+0

Да, я забыл про анонимных типов, попробуем! – CJLopez

+0

Это сработало, но теперь я столкнулся с этим, когда я верну сериализованную строку строки json, его начало снова сериализуется в ответ на запрос, в результате получилось '' {\ "response \": \ "OK \ "}" 'добавление нескольких обратных косых черт и дополнительных кавычек, его сериализация для json строки json, xD – CJLopez

+2

MVC? WebAPI? Какую технологию вы используете? –

1

лично я не думаю, что вам нужен Response класс, тем более, что она имеет object типа. ИМХО, вы слишком усложнили очень простую проблему, которая у вас есть. Это не только __type, но и другая информация, подобная HelperErrorResponseClass:#AppCommonLib, которая не должна быть там.

Другой вопрос, который у вас есть, является неправильным названием класса HelperErrorResponseClass. Это не вспомогательный класс. Это стандартный класс объектов данных.

Класс-помощник - класс, заполненный статическими методами. Он обычно используется для выделения «полезного» алгоритма.

Это, как я хотел бы сделать это:

  1. Я бы избавиться от Response класса.
  2. Я бы использовал ваш оригинальный простой класс HelperErrorResponseClass, но переименовал его в нечто более содержательное, как ErrorDetails.
  3. я возвращал ответ, как это:

.

if (errorsList.Count() > 0) { 
    return JsonConvert.SerializeObject(new { response = errorsList}); 
} 
else { 
    return JsonConvert.SerializeObject(new { response = "ok"}); 
} 

Однако, если вы действительно хотите придерживаться своего обновленного решения, легкого способ избавиться от __type просто извлекая его из конечной сериализованной строки:

if (errorsList.Count() > 0) { 
    string r = JsonConvert.SerializeObject(new { response = errorsList}); 
    return r.Replace("__type", ""); 
} 
else { 
    return JsonConvert.SerializeObject(new { response = "ok"}); 
} 
+0

Это хорошее решение, но проблема заключается в том, что я использую WCF, ответ, который уже является json-строкой объекта, и его анализируется на jason. Итак, вместо получения '{" response ":" ok "}' I'm get '" {\ "response \": \ "ok \"} "' поэтому, используя 'JsonConvert.SerializeObject', это не хороший вариант – CJLopez

+0

Я не уверен, что понимаю, что вы сказали. Не могли бы вы разместить соответствующий код? Где вы получаете '' {\ "response \": \ "ok \"} "'? Я рекомендовал избавиться от класса 'response'. Почему ваш объект 'response' уже является строкой JSON? Где он был сериализован? Тогда вы можете просто «вернуть ответ», но у меня есть ощущение, что в других частях вашего кода есть проблемы. –

+0

Я использую службы WCF, возвращая сообщения JSON с телом ответа BARE. Учитывая, что метод, уже возвращающий строку json с использованием 'JsonConvert.SerializeObject', служба снова выполняет сериализацию возвращаемой строки метода в JSON, добавляя эти обратные косые черты, чтобы просмотреть кавычки, поэтому, если я возьму ответ служба, я получаю строку json вместо объекта, который мне нужен, с свойством 'response' с его значением' 'ok '' – CJLopez

 Смежные вопросы

  • Нет связанных вопросов^_^