Как десериализовать объект JSON с помощью массива, не зная типов объектов в этом массиве

#c# #json #windows-phone-7

#c# #json #windows-phone-7

Вопрос:

Я создаю приложение Foursquare для Windows Phone 7. Это прекрасно работает с HttpWebRequests, и я отлично получаю объекты JSON. Я использую метод DataContractJsonSerializer (type). Но при десериализации этого JSON в объект, который я хочу, все идет хорошо, пока я не получаю массив объектов, где я не знаю, какой тип объекта ожидать (также не знаю количество и порядок объектов). Но мне действительно нужно определить этот тип при десериализации в методе DataContractJsonSerializer(тип).

Позвольте мне показать вам снимок JSON, который вызывает проблему:

 notifications":
[{
    "type":"notificationTray",
    "item":{
        "unreadCount":0
    }
},{
    "type":"message",
    "item":{
        "message":"OK! We've got you @ Strandslag 4. You've been here 2 times."
    }
}]
  

Итак, я десериализую это в массив объектов уведомлений с двумя элементами: «общедоступный строковый тип» и «общедоступный элемент объекта». Я не могу знать, какие и сколько уведомлений будет в массиве (и, следовательно, какого типа должен быть элемент ‘item’). Как вы можете видеть в JSON, первое уведомление содержит элемент типа int , но элемент второго уведомления имеет тип string . Но мне нужно знать это для десериализации… Или же он просто остается нулевым.. Поэтому я не могу привести его к правильному типу..

Кто-нибудь знает, как это красиво решить?

Комментарии:

1. Информацию о создании 4th amp; Mayor (другого приложения Foursquare) ищите здесь. Это может быть полезно для вас: jeff.wilcox.name/2011/03/4am-leaderboard-notification

2. Спасибо Ku6opr! Это, конечно, вариант для моей проблемы. Необходимо перестроить мое приложение из стандартного метода десериализации в библиотеку, используемую в примере. Я собираюсь попробовать! Еще раз спасибо!

Ответ №1:

Хммм, не уверен на 100%, что это ответит на ваш вопрос, но разве вы не можете использовать javascript для преобразования любого объекта в строку, а затем манипулировать им таким образом?

Что-то вроде:

значение var = независимо от [числа].toString;

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

var valueInt = parseInt(значение);

Затем используйте оператор IF, чтобы увидеть, существует ли valueInt или нет, чтобы определить, какое значение имеет первый объект.

Комментарии:

1. Это также может быть решением, но сначала я попробую JSON.net специальная библиотека для Windows Phone. Я лично думаю, что это дало бы мне более чистый код. Спасибо за вашу помощь!