2017-01-26 3 views
1

При выполнении запроса AJAX я получаю следующее сообщение об ошибке:Newtonsoft Json Ошибка преобразования значения {NULL} к типу «System.Int32»

Error converting value {null} to type 'System.Int32'. Path '[5].tabID', line 1, position 331.

Ошибка возникает во второй строке моего processRequest (...)

public void ProcessRequest (HttpContext context) { 
    string strJson = new StreamReader(context.Request.InputStream).ReadToEnd(); 
    List<ElementToUpdate> elements = JsonConvert.DeserializeObject<List<ElementToUpdate>>(strJson); 

    // (...) 
} 

отладчик говорит, что это содержание strJson:

[{ 
    "bmk": "132M1", 
    "state": "off", 
    "type": "motor", 
    "tabID": 8 
}, { 
    "bmk": "158M1", 
    "state": "off", 
    "type": "motor", 
    "tabID": 8 
}, { 
    "bmk": "194M1", 
    "state": "off", 
    "type": "motor", 
    "tabID": 8 
}, { 
    "bmk": "198M1", 
    "state": "on", 
    "type": "motor", 
    "tabID": 8 
}, { 
    "bmk": "202M1", 
    "state": "off", 
    "type": "motor", 
    "tabID": 8 
}, { 
    "bmk": "test-m", 
    "state": "on", 
    "type": "motor", 
    "tabID": null 
}, { 
    "bmk": "158M1-2", 
    "state": "off", 
    "type": "motor", 
    "tabID": 2 
}, { 
    "bmk": "100M1", 
    "state": "on_right", 
    "type": "screwconveyor", 
    "tabID": 8 
}, { 
    "bmk": "152M1", 
    "state": "on", 
    "type": "screwconveyor", 
    "tabID": 8 
}, { 
    "bmk": "192M1", 
    "state": "on_left", 
    "type": "screwconveyor", 
    "tabID": 8 
}, { 
    "bmk": "196M1", 
    "state": "off", 
    "type": "screwconveyor", 
    "tabID": 8 
}, { 
    "bmk": "2000M1", 
    "state": "on_left", 
    "type": "screwconveyor", 
    "tabID": 8 
}, { 
    "bmk": "74M1", 
    "state": "off", 
    "type": "screwconveyor", 
    "tabID": 8 
}, { 
    "bmk": "76M1", 
    "state": "off", 
    "type": "screwconveyor", 
    "tabID": 8 
}, { 
    "bmk": "80M1", 
    "state": "off", 
    "type": "screwconveyor", 
    "tabID": 8 
}, { 
    "bmk": "82M1", 
    "state": "off", 
    "type": "screwconveyor", 
    "tabID": 8 
}, { 
    "bmk": "86M1", 
    "state": "off", 
    "type": "screwconveyor", 
    "tabID": 8 
}, { 
    "bmk": "90M1", 
    "state": "off", 
    "type": "screwconveyor", 
    "tabID": 8 
}, { 
    "bmk": "94M1", 
    "state": "off", 
    "type": "screwconveyor", 
    "tabID": 8 
}, { 
    "bmk": "95M1", 
    "state": "off", 
    "type": "screwconveyor", 
    "tabID": 8 
}, { 
    "bmk": "96M1", 
    "state": "off", 
    "type": "screwconveyor", 
    "tabID": 8 
}, { 
    "bmk": "102Y1", 
    "state": "closed", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "104Y1", 
    "state": "open", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "112Y2", 
    "state": "closed", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "114Y2", 
    "state": "closed", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "120Y1", 
    "state": "closed", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "122Y1", 
    "state": "closed", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "128Y2", 
    "state": "closed", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "146Y1_2", 
    "state": "closed", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "148Y2", 
    "state": "closed", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "156Y1", 
    "state": "closed", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "180Y1", 
    "state": "open", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "182Y1", 
    "state": "closed", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "184Y1", 
    "state": "open", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "206Y1", 
    "state": "open", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "208Y1", 
    "state": "closed", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "72Y2", 
    "state": "closed", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "78Y2", 
    "state": "open", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "84Y2", 
    "state": "closed", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "88Y2", 
    "state": "closed", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "92Y2", 
    "state": "closed", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "95_1Y1", 
    "state": "blocked", 
    "type": "ventile", 
    "tabID": 8 
}, { 
    "bmk": "17H1", 
    "state": "on", 
    "type": "lamp", 
    "tabID": 8 
}, { 
    "bmk": "l1", 
    "state": "on", 
    "type": "lamp", 
    "tabID": 8 
}, { 
    "bmk": "17H1-2", 
    "state": "on", 
    "type": "lamp", 
    "tabID": 2 
}, { 
    "bmk": "106M1", 
    "state": "on", 
    "type": "elevator", 
    "tabID": 8 
}, { 
    "bmk": "154M1", 
    "state": "off", 
    "type": "elevator", 
    "tabID": 8 
}, { 
    "bmk": "164M1", 
    "state": "off", 
    "type": "rotaryvalve", 
    "tabID": 8 
}] 

Класс ElementToUpdate является

public class ElementToUpdate 
{ 
public ElementType type; 
public String bmk; 
public string state; 
public int tabID; 

public ElementToUpdate() 
{ 
} 

public ElementToUpdate(ElementType type, String bmk, string state, int tabID) 
{ 
    this.type = type; 
    this.bmk = bmk; 
    this.state = state; 
    this.tabID = tabID; 
} 
} 

Так что мой вопрос: Как решить эту проблему? Если я правильно понял сообщение об ошибке, то он говорит, что tabID из 5-го объекта json в сериализованном массиве null. Но, как видите, это не так. Кроме того, ElementToUpdate.tabID не является Int32, а int. Я что-то пропустил?

Раствор

В самом деле, моя JSON строка содержала элемент, tabID был null. Я почему-то забыл об этом, потому что во-первых, моя строка JSON не была отформатирована, когда я проверил, а во-вторых, потому что [5] означает «6-й элемент массива» (который я утверждал, что знаю на самом деле).

+1

'int' =' Int32'. На всякий случай ... [C#, int или Int32? Мне все равно?] (Http://stackoverflow.com/questions/62503/c-int-or-int32-should-i-care) – melancia

+0

@MelanciaUK Вот что я и подумал. Но сообщение об ошибке сделало меня неуверенным ... – elementzero23

+3

Я отредактировал вопрос, чтобы развернуть строку JSON, чтобы было легче увидеть, где проблема. – melancia

ответ

7

Сделайте табетический Nullable:

public int? tabID; 

Значение null не может быть десериализованным в целом. Это ваша 6-й часть JSON (или 5-й, начиная с 0):

{\"bmk\":\"test-m\",\"state\":\"on\",\"type\":\"motor\",\"tabID\":null} 

Вы могли видеть, что табетический является недействительной там.

+0

Очевидно, что ни в одном из объектов, которые я передаю, массив JSON 'tabID' равен NULL. – elementzero23

+4

@ elementzero23 Один из tabID в вашем JSON равен null, либо это было null путем сериализации, либо ваша сериализация была неправильной. –

+2

Черт! Я просто забыл об этом ??? -.- Спасибо. – elementzero23