8

JSONファイルの最後のフィールドを取得するために、Api GSONを使用してJavaを介してJSONファイルを解析したい:

記述子.json:

{
    "Teleservice_1" : {
        "Record_1" : {
            "method_name" : "mehdi",
            "method_params": ["param1",2,"param3"]
        },
        "Record_2" : {
            "method_name" : "mkyong",
            "method_params": [3,"param2"]
        },
        "Record_3" : {
            "method_name" : "amine",
            "method_params": [3,"param1","param2"]
        }
    },
    "Teleservice_2" : {
        "Record_11" : {
            "method_name" : "mehdi1",
            "method_params": ["param11",22,"param33"]
        },
        "Record_22" : {
            "method_name" : "mkyong1",
            "method_params": [33,"param22"]
        },
        "Record_33" : {
            "method_name" : "amine1",
            "method_params": [33,"param11","param22"]
        }
    },
    "Teleservice_3" : {
        "Record_111" : {
            "method_name" : "mehdi2",
            "method_params": ["param111",222,"param333"]
        },
        "Record_222" : {
            "method_name" : "mkyong2",
            "method_params": [333,"param222"]
        },
        "Record_333" : {
            "method_name" : "amine2",
            "method_params": [333,"param111","param222"]
        }
    }
}

ListTeleServices.java :

import java.util.HashMap;

public class ListTeleServices {

    private HashMap<String, TeleService> listTeleServices;

    public ListTeleServices() {

    }

    public TeleService getTeleService(String teleserviceName) {
        if(this.listTeleServices.get(teleserviceName) != null) 
            return this.listTeleServices.get(teleserviceName);
        else
            return null;
    }
}

TeleService.java :

import java.util.HashMap;

public class TeleService {

    private HashMap<String, Record> listRecords;

    public TeleService() {

    }

    public Record getRecord(String recordName) {
        if(this.listRecords.get(recordName) != null) 
            return this.listRecords.get(recordName);
        else
            return null;
    }
}

Record.java :

public class Record {

    private String method_name;
    private Object[] method_parameters; 

    public Record(String methodName, Object[] methodParameters) {
        this.method_name = new String(methodName);
        this.method_parameters = methodParameters;
    }

    public String getMethodName() {
        return this.method_name;
    }

    public Object[] getMethodParameters() {
        return this.method_parameters;
    }

    public void setMethodName(String methodName) {
        this.method_name = methodName;
    }

    public void setMethodParameters(Object[] methodParameters) {
        this.method_parameters = methodParameters;
    }
}

最後に、私のパーサー クラスJSONMainParse.java :

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import com.google.gson.Gson;


public class JSONMainParse {

    public static void main(String[] args) throws FileNotFoundException {

        BufferedReader br = new BufferedReader(new FileReader("/Users/Mehdi/Desktop/descriptor.json"));
        Gson gson = new Gson();
        ListTeleServices teleservices = gson.fromJson(br, ListTeleServices.class);
        String methodName = teleservices.getTeleService("Teleservice_2").getRecord("Record_33").getMethodName();

        System.out.println(methodName);
    }
}

それは私には正しいようで、「amine1」と表示されるはずですが、次の場所でnullPointerExceptionが発生します。

ListTeleServices.getTeleService(ListTeleServices.java:12)これは次のとおりです。

if(this.listTeleServices.get(teleserviceName) != null) 

JSONMainParse.main(JSONMainParse.java:15)で、次のようになります。

String methodName = teleservices.getTeleService("Teleservice_2").getRecord("Record_33").getMethodName();

これについて何か考えはありますか?ありがとうございました :)

4

3 に答える 3

8

解決:

JSON 応答を解析するために必要以上のクラスを使用しています! ListTeleServicesクラスを削除して、クラスTeleServiceのみを保持できますRecord

Gson gson = new Gson();
Type mapOfMapsType = new TypeToken<Map<String, Map<String, Record>>>() {}.getType();
Map<String, Map<String, Record>> map = gson.fromJson(br, mapOfMapsType);

最後に、メソッド名を取得するには、次を使用する必要があります。

String methodName = map.get("Teleservice_2").get("Record_33").getMethodName();

説明:

クラスListTeleServicesを使用して JSON を解析する場合:

ListTeleServices teleservices = gson.fromJson(br, ListTeleServices.class);

Gson が行うことは、クラスを分析し、ListTeleServicesそれを JSON 応答と比較することです。つまり、次のようになります。

  1. class を渡しましListTeleServices.classた。JSON 応答は object で始まります{}。これまでのところ、すべて問題ありません。

  2. 次に、JSON の解析を続行します。

    • クラスListTeleServicesで、何らかのオブジェクトである属性を見つけlistTeleServicesます (現時点ではタイプは気にしません)。
    • ただし、JSON 応答では 、 、 の 3 つの要素が見つかり"Teleservice_1"ます"Teleservice_2""Teleservice_3"、同じ名前の要素がないlistTeleServicesため、Gson はこれらの値をすべてスキップnullして属性に割り当てますlistTeleServices...

Gson では、JSON 応答の名前が、応答の解析に使用しているクラスの名前と同じである必要があることに注意してください。

一方、 a を直接使用するとMap<String, Map<String, Record>>、Gson は次のようになります。

  1. の型を渡しましMap<String, Map<String, Record>>た。JSON 応答はオブジェクトで始まります{}。これまでのところ、すべて問題ありません。Map(aは単なるオブジェクトであることを忘れないでください)

  2. 次に、JSON の解析を続行します。

    • キー (文字列) と値 (何らかのオブジェクト) のいくつMap<String, Map<String, Record>>かのペアが必要であることがわかります。
    • そして、JSON 応答では、いくつかの文字列のペア"Teleservice_1""Teleservice_2"および"Teleservice_3"、およびいくつかのオブジェクトが正確に検出される{}ため、問題なく解析を続けることができます...

PS:さらに進むには、クラスにListTeleServices次の属性を含めることができることに注意してください。

private HashMap<String, Record> Teleservice_1;
private HashMap<String, Record> Teleservice_2;
private HashMap<String, Record> Teleservice_3;

それはうまくいきますが、この方法では任意の数のテレサービス オブジェクトを持つことはできません...


ところで、私は他のエラーにも気付きました: あなたのResponseクラスでは、属性名method_parametersが JSON 応答のフィールド名と一致しませんmethod_params。属性名を変更するか、注釈を使用できます。

@SerializedName("method_params")
private Object[] method_parameters;
于 2013-05-07T10:54:39.090 に答える
2

これを変える:

private HashMap<String, TeleService> listTeleServices;

これに

private HashMap<String, TeleService> listTeleServices = new HashMap<String,TeleService>();
于 2013-05-07T10:42:22.947 に答える
2

初期化する

private HashMap<String, TeleService> listTeleServices;

なので

private HashMap<String, TeleService> listTeleServices = new HashMap<>();

現在のコードでは、null オブジェクトでインスタンス メソッドを呼び出そうとしているため、NullPointerExceptionをスローget()するオブジェクト参照で呼び出そうとしています。null

于 2013-05-07T10:40:31.283 に答える