Как преобразовать JSON в VB.net для использования в PHP

#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("""", """""")
  

Есть две проблемы, с которыми я сталкиваюсь:

  1. Я добавил 2 метода замены в jsonString, потому что в VB.net строка JSON будет иметь разрывы строк (хорошее форматирование) и на один » меньше, чем, по-видимому, выдает PHP при сопоставимой конструкции. Я думаю, что мой приведенный выше код является исправлением, а не соглашением. Но пока это работает нормально, если я не придумаю, как избежать этого исправления!

  2. Основная проблема заключается в том, что это ожидаемая строка 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, но рад, что вы смогли перевести то, что я говорил. Поздравляю