2016-11-07 13 views
1

以下のJSONコンテンツを解析する必要があります。現在、私はそれをファイルに保存し、それを読み込んでいます。私は作成されたサンプルのPOJOクラスと以下で試したコードを与えました。配列の文字列を解析するGson

は、2つの異なるアプローチを試してみましたが、両方が次のエラー

Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 3 path $

JSONファイル


{ 
    "DeviceCommon": { 
     "ASIdentifier": "123", 
     "DatadeliveyMechanism": "notify", 
     "MobileOriginatorCallbackReference": { 
      "url": "http://application.example.com/inbound/notifications/modatanotification/" 
     }, 
     "AccessiblityCallbackReference": { 
      "url": "http://application.example.com/inbound/notifications/accessibilitystatusnotification" 
     } 
    }, 
    "DeviceList": [{ 
     "ExternalIdentifer": "[email protected]", 
     "msisdn": "123456", 
     "senderName": "Device1", 
     "MobileOriginatorCallbackReference": { 
      "notifyURL": "http://application.example.com/inbound/notifications/modatanotification/" 
     }, 
     "ConfigurationResultCallbackReference": { 
      "notifyURL": "http://application.example.com/inbound/notifications/configurationResult" 
     }, 
     "ASreferenceID": "AS000001", 
     "NIDDduration": "1d" 
    }] 
} 

POJOクラス与えている:
注:私はここでの唯一の2つのクラスを言及しています。

package com.As.jsonmodel.configrequest; 

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 

@JsonIgnoreProperties(ignoreUnknown = true) 

public class ConfigurationRequest 
{ 
    private DeviceList[] DeviceList; 

    private DeviceCommon DeviceCommon; 

    public DeviceList[] getDeviceList() 
    { 
     return DeviceList; 
    } 

    public void setDeviceList (DeviceList[] DeviceList) 
    { 
     this.DeviceList = DeviceList; 
    } 

    public DeviceCommon getDeviceCommon() 
    { 
     return DeviceCommon; 
    } 

    public void setDeviceCommon (DeviceCommon DeviceCommon) 
    { 
     this.DeviceCommon = DeviceCommon; 
    } 

    @Override 
    public String toString() 
    { 
     return "ClassPojo [DeviceList = "+DeviceList+", DeviceCommon = "+DeviceCommon+"]"; 
    } 
} 

package com.As.jsonmodel.configrequest; 


public class DeviceList 
{ 
    private MobileOriginatorCallbackReference MobileOriginatorCallbackReference; 

    private String NIDDduration; 

    private String ASreferenceID; 

    private String senderName; 

    private String ExternalIdentifer; 

    private String msisdn; 

    private ConfigurationResultCallbackReference ConfigurationResultCallbackReference; 

    public MobileOriginatorCallbackReference getMobileOriginatorCallbackReference() 
    { 
     return MobileOriginatorCallbackReference; 
    } 

    public void setMobileOriginatorCallbackReference (MobileOriginatorCallbackReference MobileOriginatorCallbackReference) 
    { 
     this.MobileOriginatorCallbackReference = MobileOriginatorCallbackReference; 
    } 

    public String getNIDDduration() 
    { 
     return NIDDduration; 
    } 

    public void setNIDDduration (String NIDDduration) 
    { 
     this.NIDDduration = NIDDduration; 
    } 

    public String getASreferenceID() 
    { 
     return ASreferenceID; 
    } 

    public void setASreferenceID (String ASreferenceID) 
    { 
     this.ASreferenceID = ASreferenceID; 
    } 

    public String getSenderName() 
    { 
     return senderName; 
    } 

    public void setSenderName (String senderName) 
    { 
     this.senderName = senderName; 
    } 

    public String getExternalIdentifer() 
    { 
     return ExternalIdentifer; 
    } 

    public void setExternalIdentifer (String ExternalIdentifer) 
    { 
     this.ExternalIdentifer = ExternalIdentifer; 
    } 

    public String getMsisdn() 
    { 
     return msisdn; 
    } 

    public void setMsisdn (String msisdn) 
    { 
     this.msisdn = msisdn; 
    } 

    public ConfigurationResultCallbackReference getConfigurationResultCallbackReference() 
    { 
     return ConfigurationResultCallbackReference; 
    } 

    public void setConfigurationResultCallbackReference (ConfigurationResultCallbackReference ConfigurationResultCallbackReference) 
    { 
     this.ConfigurationResultCallbackReference = ConfigurationResultCallbackReference; 
    } 

    @Override 
    public String toString() 
    { 
     return "ClassPojo [MobileOriginatorCallbackReference = "+MobileOriginatorCallbackReference+", NIDD duration = "+NIDDduration+", AS referenceID = "+ASreferenceID+", senderName = "+senderName+", ExternalIdentifer = "+ExternalIdentifer+", msisdn = "+msisdn+", ConfigurationResultCallbackReference = "+ConfigurationResultCallbackReference+"]"; 
    } 
} 

JSONリーダー
Approach1:

 BufferedReader br = null; 
     try { 
      br = new BufferedReader( 
        new FileReader("/home/raj/apache-tomcat-8.0.3/webapps/file.json")); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     JsonReader jsonReader = new JsonReader(new FileReader("/home/raj/apache-tomcat-8.0.3/webapps/file.json")); 

     jsonReader.beginObject(); 

     while (jsonReader.hasNext()) { 

     String name = jsonReader.nextName(); 
      if (name.equals("DeviceCommon")) { 
       readApp(jsonReader); 

      } 
     } 

     jsonReader.endObject(); 
     jsonReader.close(); 
    } 

    public static void readApp(JsonReader jsonReader) throws IOException{ 
     jsonReader.beginObject(); 
     while (jsonReader.hasNext()) { 
      String name = jsonReader.nextName(); 
      System.out.println(name); 
      if (name.contains("ASIdentifier")){ 
       jsonReader.beginObject(); 
       while (jsonReader.hasNext()) { 
        String n = jsonReader.nextName(); 
        if (n.equals("MobileOriginatorCallbackReference")){ 
         System.out.println(jsonReader.nextString()); 
        } 
        if (n.equals("AccessiblityCallbackReference")){ 
         System.out.println(jsonReader.nextInt()); 
        } 
        if (n.equals("DeviceList")){ 
         jsonReader.beginArray(); 
         while (jsonReader.hasNext()) { 
           System.out.println(jsonReader.nextString()); 
         } 
         jsonReader.endArray(); 
        } 
       } 
       jsonReader.endObject(); 
      } 

     } 
     jsonReader.endObject(); 
    } 


    // TODO Auto-generated method stub 

Aproach2:

Gson gson = new Gson(); 
DeviceList [] myTypes = gson.fromJson(new FileReader("/home/raj/apache-tomcat-8.0.3/webapps/file.json"), DeviceList[].class); 
System.out.println(gson.toJson(myTypes)); 

このファイルを解析する方法に関する参考情報は参考になります。

+3

あなたが真剣にちょうど** HTTPを使用することを検討してください可能性があります。 org/** JSONをコピーして、文字通りGSONがこのファイルを解析するクラスを取得します(入力形式として 'JSON'、ライブラリとして' GSON'を設定してください)。 – EpicPandaForce

+0

'DeviceList [] myTypes = gson .fromJson(.../file.json) 'あなたのJSONは配列を保持していませんが、o配列を保持するbject。 'ConfigurationRequest cr = gson.fromJson(.../file.json)'を使い、 'cr.getDeviceList()'を返す返されたオブジェクトのget配列から取得します。 – Pshemo

+0

なぜ 'ConfigurationRequest'の代わりに' DeviceList [] '型を使用しますか? – njzk2

答えて

1

はここGsonでそれを行う方法は次のとおりです。次のような出力になりますMainを実行

import java.io.FileReader; 
import java.util.Arrays; 
import com.google.gson.Gson; 
import com.google.gson.annotations.SerializedName; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     Data data = new Gson().fromJson(new FileReader("data.json"), Data.class); 
     System.out.println(data); 
    } 
} 

class Data { 

    @SerializedName("DeviceCommon") 
    DeviceCommon deviceCommon; 

    @SerializedName("DeviceList") 
    DeviceListEntry[] deviceList; 

    @Override 
    public String toString() { 
     return "Data{" + 
       "\n deviceCommon=" + deviceCommon + 
       "\n deviceList=" + Arrays.toString(deviceList) + 
       "\n}"; 
    } 
} 

class DeviceCommon { 

    @SerializedName("ASIdentifier") 
    String asIdentifier; 

    @SerializedName("DatadeliveyMechanism") 
    String datadeliveyMechanism; 

    @SerializedName("MobileOriginatorCallbackReference") 
    Url mobileOriginatorCallbackReference; 

    @SerializedName("AccessiblityCallbackReference") 
    Url accessiblityCallbackReference; 

    @Override 
    public String toString() { 
     return "DeviceCommon{" + 
       "\n asIdentifier='" + asIdentifier + '\'' + 
       "\n datadeliveyMechanism='" + datadeliveyMechanism + '\'' + 
       "\n mobileOriginatorCallbackReference=" + mobileOriginatorCallbackReference + 
       "\n accessiblityCallbackReference=" + accessiblityCallbackReference + 
       "\n }"; 
    } 
} 

class DeviceListEntry { 

    @SerializedName("ExternalIdentifer") 
    String externalIdentifer; 

    String msisdn; 

    String senderName; 

    @SerializedName("MobileOriginatorCallbackReference") 
    NotifyUrl mobileOriginatorCallbackReference; 

    @SerializedName("ConfigurationResultCallbackReference") 
    NotifyUrl configurationResultCallbackReference; 

    @SerializedName("ASreferenceID") 
    String asReferenceID; 

    @SerializedName("NIDDduration") 
    String nidDduration; 

    @Override 
    public String toString() { 
     return "DeviceListEntry{" + 
       "\n externalIdentifer='" + externalIdentifer + '\'' + 
       "\n msisdn='" + msisdn + '\'' + 
       "\n senderName='" + senderName + '\'' + 
       "\n mobileOriginatorCallbackReference=" + mobileOriginatorCallbackReference + 
       "\n configurationResultCallbackReference=" + configurationResultCallbackReference + 
       "\n asReferenceID='" + asReferenceID + '\'' + 
       "\n nidDduration='" + nidDduration + '\'' + 
       "\n }"; 
    } 
} 

class Url { 

    String url; 

    @Override 
    public String toString() { 
     return url; 
    } 
} 

class NotifyUrl { 

    String notifyURL; 

    @Override 
    public String toString() { 
     return notifyURL; 
    } 
} 

://www.jsonschema2pojo:

Data{ 
    deviceCommon=DeviceCommon{ 
    asIdentifier='123' 
    datadeliveyMechanism='notify' 
    mobileOriginatorCallbackReference=http://application.example.com/inbound/notifications/modatanotification/ 
    accessiblityCallbackReference=http://application.example.com/inbound/notifications/accessibilitystatusnotification 
    } 
    deviceList=[DeviceListEntry{ 
    externalIdentifer='[email protected]' 
    msisdn='123456' 
    senderName='Device1' 
    mobileOriginatorCallbackReference=http://application.example.com/inbound/notifications/modatanotification/ 
    configurationResultCallbackReference=http://application.example.com/inbound/notifications/configurationResult 
    asReferenceID='AS000001' 
    nidDduration='1d' 
    }] 
} 
+0

解決に感謝します。それは多くの助けとなりました。複数の質問のカップル。 1.データクラスから特定のファイル(例:misdn)を取得するにはどうすればよいですか? 2.ファイルを読む代わりに、httpリクエストからどのように取得できますか?ここでのアイデアは、このJSONデータをRESTサーバーに送信することです(ポスト)メソッドで、HTTPからコンテンツを直接読み込み、JSONからgsonを呼び出す必要があります。 – ramkriz

+0

@ramkriz特定のフィールドを取得するには、それらのメソッドを作成します。残っている問題があればここに新しい質問を作成することをお勧めします。これらのコメントボックスは、Q&Aにはあまり適していません。 –

+0

情報ありがとう – ramkriz