Обработка ответа JSON, который является String или Array, используя ту же переменную в JAVA

Это позволит вам опросить любой класс WMI и получить нужные значения для свойств. В вашем случае вы можете выбрать из класс Win32_VideoController . Другой класс WMI может быть найден здесь .

Imports System.Management

Public Class WMI

    Public Shared Function GetWMISettingsDictionary(ByVal wmiClass As String,
                      ShoppingList() As String) As Dictionary(Of String, String)

        Dim wmiInfo As New Dictionary(Of String, String)
        Dim searcher As New System.Management.ManagementObjectSearcher("select * from " & wmiClass)
        For Each item As System.Management.ManagementObject In searcher.Get

            For Each PC As System.Management.PropertyData In item.Properties

                ' perform case insensitive search 
                For Each s As String in ShoppingList
                    If s.ToLowerInvariant = PC.Name.ToLowerInvariant Then
                        If PC.Value IsNot Nothing Then
                            wmiInfo.Add(PC.Name, PC.Value.ToString)
                            ' halt search-by-name
                            Exit For
                        End If
                    End If
                Next
            Next 
            ' Note: this is to prevent a crash when there is more than one item
            ' WMI reports on such as 2 display adapters; just get the first one.
            Exit For
        Next

        Return wmiInfo
    End Function


    ' helpful tool to see how WMI props are organized, discover the names etc  
    Public Shared Sub DebugWMIPropValues(wmiClass As String)

        Using searcher As New Management.ManagementObjectSearcher("Select * from " & wmiClass)
            Dim moReturn As Management.ManagementObjectCollection = searcher.Get

            For Each mo As Management.ManagementObject In moReturn
                Console.WriteLine("====")
                DebugProperties(mo)

            Next
        End Using

    End Sub

    ' debug tool to poll a management object to get the properties and values
    Private Shared Sub DebugProperties(mo As Management.ManagementObject)

        For Each pd As PropertyData In mo.Properties
            If pd.Value IsNot Nothing Then

                If pd.Value.GetType Is GetType(String()) Then
                    Dim n As Integer = 0
                    For Each s As String In CType(pd.Value, Array)
                        Console.WriteLine("{0}({1}): {2}", pd.Name, n.ToString,
                                          If(pd.Value IsNot Nothing,
                                             s,
                                             "Nothing"))
                        n += 1
                    Next
                Else
                    Console.WriteLine("{0}: {1}", pd.Name,
                                      If(pd.Value IsNot Nothing,
                                         pd.Value.ToString,
                                         "Nothing"))
                End If
            End If
        Next
    End Sub
End Class

Чтобы использовать его, вы просто создаете «список покупок» свойств, которые вы хотите, и передаете класс WMI:

Dim shopList() As String = {"VideoProcessor", "Name", "AdapterRAM"}

' the return is a Dictionary to keep the Name and Value together
Dim wmiItems As Dictionary(Of String, String)
wmiItems = WMI.GetWMISettingsDictionary("Win32_VideoController", shopList)

' print them to the console window:
For Each kvp As KeyValuePair(Of String, String) In wmiItems
    Console.WriteLine("Item: {0}   value: {1}", kvp.Key, kvp.Value)
Next

Класс включает способ сбросить имена свойств и значения для класса. Чтобы использовать его:

WMI.DebugWMIPropValues("Win32_VideoController")

Просто посмотрите в окне вывода для результатов (меню отладки -> Windows -> Ouput)

Пример вывода для списка покупок:

Item: AdapterRAM   value: 1073741824
Item: Name   value: AMD Radeon HD 6450
Item: VideoProcessor   value: ATI display adapter (0x6779)

Работает на My SystemTM


Примечания, обновление: GetWMISettingsDictionary предназначена для сбора свойств для одного элемента. Как и в случае, он получит настройки для большинства вещей, но только первую видеокарту, первый дисплей и т. Д.

Существует несколько способов изменить это в зависимости от того, что вам нужно. Он может быть изменен для возврата отдельного Dictionary в List для каждого элемента. Или вы можете добавить предложение WHERE к имени класса WMI, чтобы получить свойства для определенного устройства и вызвать его как можно чаще:

  wmiClass = "Win32_VideoController WHERE Name = 'FizzBar Deluxe'"
  ' or
  wmiClass = "Win32_VideoController WHERE DeviceID = 'VideoController1'"

  wmiItems = WMI.GetWMISettingsDictionary(wmiClass , shopList)

Поиск по имени теперь не учитывает регистр.

Наконец, обратите внимание, что при использовании низкокачественных видеоадаптеров AdapterRAM будет отображаться общая системная память. Это связано с тем, что адаптеры без встроенной ОЗУ просто используют системную память, поэтому она правильно сообщает.

0
задан Cloudravi 4 March 2019 в 06:24
поделиться

2 ответа

Я думаю, что в этом случае вы можете использовать исключение try catch. Во-первых, попытайтесь обработать ответ как строку. если возникает ошибка, просто перехватите ошибку и обработайте ответ как массив.

0
ответ дан Thanh Nham 4 March 2019 в 06:24
поделиться

Просто проверьте тип данных части message JSON и, соответственно, используйте ее.

Посмотрите на этот пример.

package test;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class jsonDeco {

    public static void main(String[] args) throws JSONException {
        // TODO Auto-generated method stub
        JSONObject a = new JSONObject("{ \"status_code\": 2002, \"sub_status_code\": 2002,"
                + " \"message\": \"Service Invoke Create Step2 Success\"} ");
        JSONObject b = new JSONObject("{ \"status_code\": 7000, \"sub_status_code\": 7001,"
                + " \"message\": [ \"Step No: Step 2: Line No: 92 Variable Name: lan-pool-ipv6-mask"
                + " Error Code: 7516 Error Detail: Lan Pool IPV6 network address is invalid Description: \" ]}");
        parseAORB(b);
    }

    public static void parseAORB(JSONObject input) throws JSONException
    {
        String code = input.getString("status_code");
        System.out.println(code);
        System.out.println(nameOf(input.get("message")));
        if(nameOf(input.get("message")).equals("String"))
        {
            System.out.println("inside string");
            String message = input.getString("message");
            System.out.println("Message is : "+message);
        }
        else if (nameOf(input.get("message")).equals("JSONArray"))
        {
            JSONArray message = input.getJSONArray("message");
            System.out.println("inside jsonarray");
            System.out.println("Message is : "+message.getString(0).toString());
        }   
    }

    private static String nameOf(Object o) {
        return o.getClass().getSimpleName();
    }
}

Вы можете передать переменную a или b для проверки.

P.S. В комментарии оба примера неверны. В первом из них есть еще одна запятая , в конце, а во втором примере вы не закрыли фигурную скобку }.

0
ответ дан driftking9987 4 March 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: