2016-06-11 14 views
1

私はGsonでいくつかのJSONを解析しようとしていると私は、問題を次のようしているあるフィールドを持つJSONの解析:これは私のJSONあるGson - 配列や文字列

を:

[{ 
    "label": "Check Digit", 
    "value": "W" 
}, 
{ 
    "label": "Equipment", 
    "value": [ 
    "With Standard Liftgate", 
    "(-) Version Packages" 
    ] 
}] 

これは私のjavaですクラス:Gsonはそれを解析し、常に文字列の配列としてvalue使用できるようにする方法

public class Decode { 

    private String label; 
    private List<String> value = new ArrayList<>(); 

    public String getLabel() { 
     return label; 
    } 

    public void setLabel(String label) { 
     this.label = label; 
    } 

    public List<String> getValue() { 
     return value; 
    } 

    public void setValue(List<String> value) { 
     this.value = value; 
    } 

} 

+0

私は、標準でこのJSON文字列を解析: '新しいGson().Json(jsonString、WholeObjectClass.class) ' 私はその奇妙な状況は同じフィールドは異なるタイプを持つことができると思う。 –

+2

マップされたオブジェクトクラスコードを共有します。 – everton

+0

javaクラスコードを追加しました。問題は、jsonの最初のオブジェクトに文字列の配列ではなく文字列があることです。 Jsonは外部APIによって提供されています。 –

答えて

4

私の提案があるのに役立ちます願っています -

手順1:に以下の変更を加えてください。クラス。

Decode.java

import java.util.ArrayList; 
import java.util.List; 

public class Decode { 

private String label; 
private List<String> values = new ArrayList<>(); // in json it is "value" 

public String getLabel() { 
    return label; 
} 

public void setLabel(String label) { 
    this.label = label; 
} 

public List<String> getValues() { 
    return values; 
} 

public void setValues(List<String> values) { 
    this.values = values; 
} 

@Override 
public String toString() { 
    return "Decode [label=" + label + ", values=" + values + "]"; 
} 

} 

ステップ2:JsonDeserializer次のよう作成してください。

MyDeserializer.java

import java.lang.reflect.Type; 
import java.util.ArrayList; 
import java.util.List; 

import com.google.gson.Gson; 
import com.google.gson.JsonDeserializationContext; 
import com.google.gson.JsonDeserializer; 
import com.google.gson.JsonElement; 
import com.google.gson.JsonObject; 
import com.google.gson.JsonParseException; 
import com.google.gson.reflect.TypeToken; 

public class MyDeserializer implements JsonDeserializer<Decode> { 

@Override 
public Decode deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException { 
    JsonObject decodeObj = arg0.getAsJsonObject(); 
    Gson gson = new Gson(); 
    Decode decode = gson.fromJson(arg0, Decode.class); 
    List<String> values = null; 
    if (decodeObj.get("value").isJsonArray()) { 
     values = gson.fromJson(decodeObj.get("value"), new TypeToken<List<String>>() { 
     }.getType()); 
    } else { 
     String single = gson.fromJson(decodeObj.get("value"), String.class); 
     values = new ArrayList<String>(); 
     values.add(single); 
    } 
    decode.setValues(values); 
    return decode; 
} 

} 

ステップ3:次のようにあなたのJSONをdeserializeする今その時間:

GsonMain.java

import java.io.File; 
import java.io.IOException; 
import java.nio.file.Files; 
import java.util.Arrays; 

import com.google.gson.GsonBuilder; 

public class GsonMain{ 
public static void main(String[] args) throws IOException { 
    String filename = "d:/test.json"; // contains the json 
    String content = new String(Files.readAllBytes(new File(filename).toPath())); 

    GsonBuilder b = new GsonBuilder(); 
    b.registerTypeAdapter(Decode.class, new MyDeserializer()); 
    Decode[] array = b.create().fromJson(content, Decode[].class); 
    System.out.println(Arrays.toString(array)); 
    } 

} 
+0

ありがとう!できます! –

0

JSONが適切な形式ではありません、それは次のようになります。

[{ 
    "label": "Check Digit", 
    "value": ["W"] 
}, 
{ 
    "label": "Equipment", 
    "value": [ 
    "With Standard Liftgate", 
    "(-) Version Packages" 
    ] 
}] 

もう一度パーサークラスは次のようになります。

public class Decode { 

    private String label; 
    private String[] value; 

    public String getLabel() { 
     return label; 
    } 

    public void setLabel(String label) { 
     this.label = label; 
    } 

    public String[] getValue() { 
     return value; 
    } 

    public void setValue(String[] value) { 
     this.value = value; 
    } 

} 

は、それが:)

+0

返信ありがとうございます。私はこのフォーマットが変わっていることを知っていますが、私は外部のAPIからそれを受け取ります。私はこのjsonをそのままマッピングする方法を探しています。 –

+1

これはあなた自身のデシリアライザを試すことができます。このリンクを参照してください:http://stackoverflow.com/questions/28319473/gson-same-field-name-different-types まだ私のヘルプが必要な場合に教えてください – Neo

+0

Sanjeev Sahaの答えのような独自のデシリアライザを使用しました。ありがとう。 –