2014-01-09 3 views
0

У меня есть объект JSON, как это ...JSON Десериализация в C# для нескольких значений

{ 
"totalcount":1, 
"files":[ 
{ 
"filename":"1.txt", 
"fileContent":"Dineshkumar" 
} 
] 
} 

Я создал следующие классы в C#.

public class File 
{ 
    public string filename { get; set; } 
    public string fileContent { get; set; } 
} 

public class JSONObject 
{ 
    public int totalcount { get; set; } 
    public List<File> files { get; set; } 
} 

Я использовал следующие объекты для доступа к объекту JSON.

JavaScriptSerializer JSSfile = new JavaScriptSerializer(); 
JSSfile.MaxJsonLength = Int32.MaxValue; 
JSONObject Content = JSSfile.Deserialize<JSONObject>(response); 

Теперь моя проблема .. когда у меня есть более чем 1 файлов в объекте JSON, он отлично работает, как ожидалось. Когда у меня есть только один файл в объекте JSON, он возвращает мне 0 файлов в content.

Как решить эту проблему?

Когда один файл указан как объект JSON, содержимое значение переменного начинается с 0.

Если написать этот фрагмент кода для решения этой проблемы,

if (Content.totalcount == 1) 
{ 
    File file = null; 
    file.filename = Content.files[0].filename; 
    file.fileContent = Content.files[0].fileContent; 
    File.WriteAllBytes(DestLocTxt.Text.Trim() + "\\" + file.filename, file.fileContent)); 
    } 

я получил следующее сообщение об ошибке:

An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll 

Additional information: Index was out of range. Must be non-negative and less than the size of the collection. 

Проблема решаемая:

{ 
"totalcount":1, 
"files":[ 
{ 
"filename":"1.txt", 
"fileContent":"Dineshkumar" 
} 
] 
} 

был ожидаемым JSON, но сервер отправляет данные в другом формате.

{ 
"totalcount":1, 
"files": { 
"filename":"1.txt", 
"fileContent":"Dineshkumar" 
} 
} 

Все проблемы, вызванные из-за этого ...

+0

Не могли бы вы привести пример JSON, который у вас есть с несколькими файлами - проблема может быть в этом. –

+2

Подтвердите свой JSON с помощью http://jsonlint.com/ - пример, который вы опубликовали, хорош, но я предполагаю, что другого нет. Если это верно и правильно, вы можете переключиться на [Json.NET] (http://james.newtonking.com/json), где можно найти более удобную библиотеку JSON. –

+0

@ScottGulliver Я обновил свой вопрос, чтобы быть более понятным, из-за нумерации списков и десериализации. – Dinesh

ответ

0

Проблема здесь не с JSON - это с объектом File, который вы создаете. В примере, который вы указали, вы пытаетесь установить имя файла, даже если оно равно null. Убедитесь, что объект фактически создан, прежде чем пытаться установить на нем свойства. Объект Content прекрасен, и список файлов действительно содержит один файловый объект.

Это ваш пример, с исправлением на месте:

var json = "{\"totalcount\":1,\"files\":[{\"filename\":\"1.txt\",\"fileContent\":\"Dineshkumar\"}]}"; 

JavaScriptSerializer JSSfile = new JavaScriptSerializer(); 
JSSfile.MaxJsonLength = Int32.MaxValue; 
JSONObject Content = JSSfile.Deserialize<JSONObject>(json); 

if (Content.totalcount == 1) 
{ 
    File file = new File(); //CREATE A NEW FILE OBJECT HERE <------ 
    file.filename = Content.files[0].filename; 
    file.fileContent = Content.files[0].fileContent; 
} 
+0

С этим новым объектом тоже одна и та же проблема :(.. Проблема с десериализацией, я думаю .. 'content' не подходит должным образом. :( – Dinesh

+0

Странный - этот пример отлично работал для меня. Пробовали ли вы установить точку останова после десериализация выполняется для проверки объекта контента? –

+0

@Scottt Все это связано с тем, что JSON отправляется сервером. Спасибо за помощь в устранении проблемы. – Dinesh

0

Просто измените JSONObject-класс, как это. Чем это должно работать:

public class JSONObject 
{ 
public int totalcount { get; set; } 
public File files { get; set; } 
} 
+0

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

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