JSON Desirialization для Specflow API тестов

csharp
specflow
api
json
java
testng
Теги: #<Tag:0x00007fedc7b2ff68> #<Tag:0x00007fedc7b2fd88> #<Tag:0x00007fedc7b2fc20> #<Tag:0x00007fedc7b2fa90> #<Tag:0x00007fedc7b2f950> #<Tag:0x00007fedc7b2f810>

(Ilya G) #1

всем привет,

есть такой #json

{
	"transactionId": "REF0001005163335921032",
	"todo": false,
	"pendingApproval": false,
	"complete": true,
	"accountType": "cr",
	"isPersonal": false
}

есть такой #c-sharp::tag class

 public class RootObject
        {
            public string transactionId { get; set; }
            public bool todo { get; set; }
            public bool pendingApproval { get; set; }
            public bool complete { get; set; }
            public string accountType { get; set; }
            public bool isPersonal { get; set; }
        }

как десериализовать?

пробовал

var transactions = JsonConvert.DeserializeObject<RootObject>(json);

and

var deserial = new JsonDeserializer();
var transactions = deserial.Deserialize<RootObject>(json);

всегда ошибка:
Unexpected character encountered while parsing value: . Path ‘’, line 0, position 0

Подскажите пожалуиста что делаю не так

спасибо.


(Дмитрий Жарий) #2

эта ошибка, симтом того, что в переменной json при выполнеии теста, у вас не совсем json.
Поставьте точку останова в дебагере и посмотрите что внутри, либо сохраните значение в файл


(Ilya G) #3

Спасибо за совет, так все и сделал, интересная штука получилось:

В начале есть пробел(или что то непонятное, но выглядит как пробел в notepad ++), пишу тест с использованием RestSharp, когда пытаюсь посмотреть значение var json = response.Content он даже в студии ругается, что это не джейсон(но выглядит ок). Но если записать в файл и прочитать то все хорошо.
Либо json.Substring(1) и после этого все отлично.
Но эти два варианта выглядят как костыль.

Раньше эти тесты были в postman, там все работает без проблем.
Плюс есть другие тесты, которые работают в студии нормально, т.е json deserialize без проблем.

В чем может быть причина?


#4

Не очень понятно, в чем у вас проблема :slight_smile:
Могу предположить, что в кавычках. Откуда вы получаете JSON и что с ним делаете до того как собираетесь десериализовать?

 String json = @"{
	                'transactionId': 'REF0001005163335921032',
                        'todo': false,
	                'pendingApproval': false,
	                'complete': true,
	                'accountType': 'cr',
	                'isPersonal': false
                }";
            RootObject model = JsonConvert.DeserializeObject<RootObject>(json);


(Ilya G) #5

есть такой код -

RestResponse response = _restResponse.GetRestResponse(_baseUrl + "/set", Method.GET);
string content = response.Content;
content = content.Substring(1);
var jArrayOnFly = JArray.Parse(content).ToString();
var transactionsTotalsJson = JsonConvert.DeserializeObject<List<TransactionsSetJson.RootObject>>(jArrayOnFly);

вся боль в том, что сервис возвращает “плохой” json и в строке content = content.Substring(1); я это правлю,
но выглядит это не правильно, думаю это бага нашего сервися, но не уверен.


#6

Если ваш приходящий JSON не валидный, и об этом ничего не сказано в спеке - заводите соответсвующий баг\тикет т.к. ваш сервис отдает не валидные значения