2012-03-15 5 views
2

Webサーバーから受け取ったjavaScriptオブジェクトの解析に問題があります。 これらのオブジェクトはJSONとしていますが、数値キーを含んでいます。数値キーによるjavaScriptオブジェクトの解析用のJavaライブラリ

javascriptオブジェクト:

{a: "alpha", 2: "two"} 

質問は、私はJavaで、このようなJavaScriptのオブジェクトをデコードすることができる方法ですか? 使用可能な既存のライブラリはありますか?そして、Javaでそのオブジェクトを表現する方法がある場合:私は、ウェブ上の私の問題のための任意の解決策を見つけることができませんでしたよう

public class JavaObject { 
    private String a;   // for field - a: "alpha" 
    private ???     // for field - 2: "two" 
} 

おかげ

+0

JavaScriptのオブジェクトキーは常に文字列です。 'a'をキー' 'a ''に、 '2''を' '2'' 'にすることができます。オブジェクトを 'JSON.stringify'すると、すべてのキーが引用符で囲まれます。答えは – pimvdb

+0

10倍。 JSON.stringifyの後、私のJavaScriptデータをJSONObjectにデコードできますが、まだJavaクラスにデータを表現することはできません。 :( – Grandanat

答えて

2

、私は自分自身にそのように処理するためGSONライブラリ用のアダプタを実装しましたデータ。

よく知られているJSONは文字列キーのみをサポートしています。 このようなjsonデータを持つ場合{"a": "alpha"、 "2": "3":3}普通のJSONObjectで変換できますが、変換できませんそれは私自身のJavaオブジェクトです。 は、この状況に対処するために、私は、ObjectMapオブジェクト

// ObjectMap.java 
import java.util.Map; 

public class ObjectMap<V> { 

    private Map<String, V> map; 

    public ObjectMap(Map<String, V> map) { 
     setMap(map); 
    } 

    public Map<String, V> getMap() { 
     return map; 
    } 

    public void setMap(Map<String, V> map) { 
     this.map = map; 
    } 

    @Override 
    public String toString() { 
     return "ObjectMap [map=" + map + "]"; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((map == null) ? 0 : map.hashCode()); 
     return result; 
    } 

    @SuppressWarnings("rawtypes") 
    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     ObjectMap other = (ObjectMap) obj; 
     if (map == null) { 
      if (other.map != null) 
       return false; 
     } else if (!map.equals(other.map)) 
      return false; 
     return true; 
    } 
} 

とそのためのgsonアダプタObjectMapAdapterを作成しました。

//ObjectMapAdapter.java 
import java.io.IOException; 
import java.lang.reflect.ParameterizedType; 
import java.lang.reflect.Type; 
import java.util.LinkedHashMap; 
import java.util.Map; 
import java.util.Map.Entry; 

import com.google.gson.Gson; 
import com.google.gson.TypeAdapter; 
import com.google.gson.TypeAdapterFactory; 
import com.google.gson.internal.$Gson$Types; 
import com.google.gson.reflect.TypeToken; 
import com.google.gson.stream.JsonReader; 
import com.google.gson.stream.JsonToken; 
import com.google.gson.stream.JsonWriter; 

public class ObjectMapAdapter<V> extends TypeAdapter<ObjectMap<V>> { 

    public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() { 
     @SuppressWarnings({ "unchecked", "rawtypes" }) 
     public <T> TypeAdapter create(Gson gson, TypeToken<T> typeToken) { 

      Type type = typeToken.getType(); 
      Class<? super T> rawType = typeToken.getRawType(); 

      if (!ObjectMap.class.isAssignableFrom(rawType)) { 
       return null; 
      } 

      // if (rawType != ObjectMap.class) { 
      // return null; 
      // } 

      Type componentType; 
      if (type instanceof ParameterizedType) { 
       componentType = ((ParameterizedType) type).getActualTypeArguments()[0]; 
      } else { 
       componentType = Object.class; 
      } 

      TypeAdapter<?> componentTypeAdapter = gson.getAdapter(TypeToken.get(componentType)); 
      return new ObjectMapAdapter(gson, componentTypeAdapter, $Gson$Types.getRawType(componentType)); 

     } 
    }; 

    // private final Class<V> valueType; 
    private final TypeAdapter<V> valueTypeAdapter; 

    public ObjectMapAdapter(Gson context, TypeAdapter<V> componentTypeAdapter, Class<V> componentType) { 
     this.valueTypeAdapter = new TypeAdapterRuntimeTypeWrapper<V>(context, componentTypeAdapter, componentType); 
     // this.valueType = componentType; 
    } 

    public ObjectMap<V> read(JsonReader in) throws IOException { 

     if (in.peek() == JsonToken.NULL) { 
      in.nextNull(); 
      return null; 
     } 

     Map<String, V> map = new LinkedHashMap<String, V>(); 
     in.beginObject(); 
     while (in.hasNext()) { 
      String key = in.nextName(); 
      V comp = valueTypeAdapter.read(in); 
      map.put(key, comp); 
     } 
     in.endObject(); 

     return new ObjectMap<V>(map); 
    } 

    @Override 
    public void write(JsonWriter out, ObjectMap<V> map) throws IOException { 
     if (map == null) { 
      out.nullValue(); 
      return; 
     } 

     out.beginObject(); 
     for (Entry<String, V> entry : map.getMap().entrySet()) { 
      out.name(entry.getKey()); 
      valueTypeAdapter.write(out, entry.getValue()); 
     } 
     out.endObject(); 
    } 
} 

あなたがマップにこの

{"a": "alpha", "2": "two", "3":3} 

などのデータをデコードする準備ができている

gsonBuilder.registerTypeAdapterFactory(ObjectMapAdapter.FACTORY); 

カスタムGSONビルダーを作成し、このファクトリを登録

​​
関連する問題