#php #arrays #json #vb.net #dictionary
#php #массивы #json #vb.net #словарь
Вопрос:
Мне передали php-файл, который отправляет строку JSON в API. Приложение, с которым я работаю, чтобы сделать то же самое, однако, работает на VB.net .
Я использовал объект Dictionary для восстановления объекта JSON, но я получаю некоторые незначительные различия в конечном выводе. Вот мой код:
Dim data As New Dictionary(Of String, Object)
Dim AuthDetails As New Dictionary(Of String, Object)
AuthDetails.Add("UserID", 18)
AuthDetails.Add("Token", "One")
AuthDetails.Add("Timestamp", Date.Now().ToString("yyyyMMddhhmmss")
data.Add("AuthDetails", AuthDetails)
Dim JSONByte As Byte() = Encoding.Default.GetBytes(JsonConvert.SerializeObject(data, Formatting.Indented))
Dim JSONString As String = Encoding.ASCII.GetString(JSONByte).Replace(vbCrLf, "").Replace("""", """""")
Есть две проблемы, с которыми я сталкиваюсь:
-
Я добавил 2 метода замены в jsonString, потому что в VB.net строка JSON будет иметь разрывы строк (хорошее форматирование) и на один » меньше, чем, по-видимому, выдает PHP при сопоставимой конструкции. Я думаю, что мой приведенный выше код является исправлением, а не соглашением. Но пока это работает нормально, если я не придумаю, как избежать этого исправления!
-
Основная проблема заключается в том, что это ожидаемая строка PHP JSON, которая имеет незначительные отличия от того, что я могу получить в VB.net как показано ниже:
PHP:
{«»AuthDetails»»:[{«»Идентификатор пользователя»»:»»18″»,»» Токен»»:»»Единица»»,»»Отметка времени»»:»»20190424132431″»}]}
VB.net:
{ «»AuthDetails»»: { «»Идентификатор пользователя»»: «»18″», «» Токен»»: «»Единица»», «»Отметка времени»»: «»20190424053345″» }}
Итак, если вы посмотрите внимательно, в приведенной выше части PHP есть несколько квадратных скобок, которых мне не хватает в моем VB.net часть. Я понимаю, что это PHP-способ определения массивов, но я не могу понять, как это сделать в VB.net с объектом Dictionary, который я использовал.
Пожалуйста, помогите мне определить дополнительную квадратную скобку к моей строке JSON.
Редакция:
Я могу добраться до этого момента:
{ «»AuthDetails»»: [ { «»Ключ»»: «»Идентификатор пользователя»», «»Значение»»: «»1581″» }, { «» Ключ»»: «»Токен»», «»Значение»»: «»4f7bbcf97b4313f8353fa06c5e3a8fb6″»}, { «»Ключ»»: «»временная метка»», «»Значение»»: «»20190425052154″» } ]}
когда я преобразую объект Dictionary в массив, подобный этому:
data.Add("AuthDetails", AuthDetails.toArray())
Но это теперь вводит имена ключей и значения в строку …, которые мне не нужны!
Спасибо!
Комментарии:
1.
AuthDetails
являетсяIEnumerable(Of Object)
(это может быть массив, список). Рассматривали ли вы десериализацию / сериализацию с использованием классов? Кстати, у вас слишком много двойных кавычек 🙂 Вся часть кодирования просто не нужна (или это приведет к путанице с вашими строками).2. Квадратные скобки в php представляют собой индексированные (нумерованные) массивы, в то время как фигурные скобки являются ассоциативными массивами. Итак, когда вы видите [{ это означает, что существует массив ассоциативных массивов. Или вы могли бы представить это как массив объектов. Ваша строка Json vb присваивает объект AuthDetails вместо массива объектов.
3. Привет, Джими: php-файл заключает все эти двойные кавычки, и сервис принимает это; но не тогда, когда я отправляю его с vb.net с «меньшим количеством» двойных кавычек. Итак, я добавил их, что, на самом деле, я очень беспокоюсь, что они испортят части моих переменных строками! Я все еще думаю о том, как с этим справиться. Поставщик услуг настаивает на том, что это то, что отправляют все остальные, поэтому они не могут с этим возиться…
4. Сначала я протестирую это с помощью JSON, правильно сериализованного. Кстати, вы должны удалить это
Formatting.Indented
. Создайте структуру класса, которая представляет этот JSON: у вас естьRootObject
класс, который имеет одно свойство:Public AuthDetails As List(Of AuthDetail)
и, конечно,AuthDetail
класс, который имеет три свойства:UserID
,Token
иTimestamp
, которые могут быть полностью типа String, если вы хотите.5. Затем просто вызовите
Dim result as String = JsonConvert.SerializeObject(RootObject)
. Попробуйте отправить этот JSON, оставив двойные кавычки такими, какие они есть, и посмотрите, что получится.
Ответ №1:
Спасибо за комментарии! Это привело к тому, что я сейчас понял в качестве своего решения, как показано ниже:
Dim auth(0) As Object
auth(0) = AuthDetails
data.Add("AuthDetails", auth)
Итак, вместо добавления AuthDetails к объекту данных, я сначала добавил его в определенный массив (Тим Мортон!).
Редакция: (Jimi) Я изменил форматирование на Formatting.None
, и это убрало разрывы строк, а также устранило необходимость добавлять дополнительные двойные кавычки!
[Удален предыдущий комментарий о PHP]
Комментарии:
1. Прошло слишком много времени с тех пор, как я что-либо делал с vb, но рад, что вы смогли перевести то, что я говорил. Поздравляю