1 (изменено: The_Immortal, 2018-02-09 21:12:09)

Тема: VBS: Извлечение значения из JSON-массива

Приветствую!

Господа, пытаюсь извлечь нужную информацию вот из этой JSON-страницы.

Нашел готовый пример, как это делается с помощью сторонней библиотеки (Chilkat ActiveX) и попытался адаптировать его для себя:

Dim fso, outFile
Set fso = CreateObject("Scripting.FileSystemObject")
Set outFile = fso.CreateTextFile("output.txt", True)

'  A JSON array must be loaded using JsonArray:
set jsonArray = CreateObject("Chilkat_9_5_0.JsonArray")

success = jsonArray.Load("https://api.crypto-bridge.org/api/v1/ticker")

If (success <> 1) Then
    outFile.WriteLine(jsonArray.LastErrorText)  '!!! "Unable to get array at index 0."
    WScript.Quit
End If

'  Examine the values:
i = 0
Do While i < jsonArray.Size
    ' jsonObj is a Chilkat_9_5_0.JsonObject
    Set jsonObj = jsonArray.ObjectAt(i)
    outFile.WriteLine(i & ": " & jsonObj.StringOf("last"))

    i = i + 1
Loop

outFile.Close

Однако в выходном файле (output.txt) я вижу оишбку:

 ChilkatLog:
  Load:
    ChilkatVersion: 9.5.0.71
    Unable to get array at index 0.
  --Load
--ChilkatLog

Полагаю проблема в том, что я неправильно загружаю указанную страницу. Честно говоря, она вообще какая-то странная: при попытке обратиться к ней через IE тот воспринимает её как файл ticker.json, а вот Mozilla показывает в виде JSON-строки... =/

Подскажите, пожалуйста, как с таким работать?

Спасибо!

2

Re: VBS: Извлечение значения из JSON-массива

The_Immortal,
1) Исправьте, пожалуйста, заголовок темы в соответствии с правилами. Тогда сможем дальше вести дискуссию на тему решения задачи.
2) На сколько я понимаю, для Вашего случая, сторонние ActiveX компоненты не требуются. Достаточно средств WSH.
3) Если Вы собрались работать с JSON данными, то проще это делать в языке JavaScript, а не VBScript.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

3 (изменено: The_Immortal, 2018-02-09 21:15:05)

Re: VBS: Извлечение значения из JSON-массива

Xameleon,

Xameleon пишет:

Исправьте, пожалуйста, заголовок темы в соответствии с правилами.

Исправил, извиняюсь.

Xameleon пишет:

Если Вы собрались работать с JSON данными, то проще это делать в языке JavaScript, а не VBScript.

Дело в том, что полученные данные мне нужно далее обрабатывать определенным образом. И вся эта обработка уже реализована и написана на VBS. Собственно, именно поэтому я и попытался воспользоваться готовой ActiveX-компонентой, которая без труда перебирает JSON-массив, но вот как ей подпихнуть мою страницу - не знаю...

4

Re: VBS: Извлечение значения из JSON-массива

Пример с использованием JavaScript:
JSSample.wsf


<?xml version="1.0" ?>
<job id="JSON Request">
	<script language="JavaScript" src="https://raw.githubusercontent.com/douglascrockford/JSON-js/master/json2.js"></script>
	<script language="JavaScript">
	<![CDATA[
	with(new ActiveXObject('MSXML2.ServerXMLHTTP.6.0')){
		open('GET','https://api.crypto-bridge.org/api/v1/ticker',false);
		send();
		var array = JSON.parse(responseText);
		with(new ActiveXObject('Scripting.FileSystemObject').OpenTextFile('data.txt',2,true)){
			for(var i in array){
				WriteLine(i + ': ' + array[i].last);
			}
		}
		WScript.Echo('Data parsed');
	}
	]]>
	</script>
</job>

Пример с использованием VBScript:
VBSSample.wsf


<?xml version="1.0" ?>
<job id="JSON Request">
	<script language="JavaScript" src="https://raw.githubusercontent.com/douglascrockford/JSON-js/master/json2.js"></script>
	<script language="VBScript">
	<![CDATA[
	Option Explicit
	Dim data, i
	With CreateObject("MSXML2.ServerXMLHTTP.6.0")
		.Open "GET", "https://api.crypto-bridge.org/api/v1/ticker", False
		.Send
		Set data = JSON.parse(.responseText)
		With(CreateObject("Scripting.FileSystemObject").OpenTextFile("data.txt",2,true))
			For i = 0 to data.length - 1
				.WriteLine i & ": " & Eval("data.[" & i & "].last")
			Next
		End With
		WScript.Echo "Data parsed"
	End With
	]]>
	</script>
</job>

Такой вариант Вам подходит ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

5

Re: VBS: Извлечение значения из JSON-массива

При желании, можно даже использовать возможности HTML5 предоставленные в Internet Explorer 11, в котором уже есть нативная поддержка JSON и расширенная версия объекта XMLHttpRequest. Но для этого, конечно же, нужно, чтобы он (IE11) был установлен в системе.


<?xml version="1.0" encoding="UTF-8"?>
<job>
	<script language="VBScript">
	<![CDATA[
	Option Explicit
	Dim fileName, document, window
	'Небольшой хак для загрузки движка Internet Explorer в режиме совместимости IE=11 (с поддержкой HTML5)
	'Получение ссылки на документ
	Set document = WScript.GetObject("res://ieframe.dll/23/EN-US-PAGE2.HTML")
	'Получение ссылки на окно
	Set window = document.parentWindow
	'Ожидание полной загрузки
	While document.readyState <> "complete"
		WScript.Sleep 100
	Wend

	Dim JSON, i, elements, textStream
	'Получение ссылки на объект JSON
	Set JSON = window.JSON
	'Создание объекта XMLHttpRequest
	With(window.XMLHttpRequest())
		'Открытие запроса
		.open "GET","https://api.crypto-bridge.org/api/v1/ticker",false
		'Установка возвращаемых данных
		.responseType = "JSON"
		'Выполнение запроса
		.send
		'Разбор ответа
		Set elements = JSON.parse(.responseText)
		'Открытие текстового файла для сохранения данных
		Set textStream = CreateObject("Scripting.FileSystemObject").OpenTextFile("data.txt",2,True)
		'Цикл перебора элементов
		For i = 0 to elements.length - 1
			textStream.WriteLine i & ": " & Eval("elements.[" & i & "].last")
		Next
	End With
	
	MsgBox "Complete !", vbInformation
	
	]]>
	</script>
</job>
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !