2016-04-08 19 views
0

JSONをJavaでプリミティブな値に解析する必要があるユースケースがあります。私はJSONに埋め込まれた有益なフィールドを持っています。これらのプリミティブ型は、ある長さの配列に追加する必要があります。任意のプリミティブ型をa Java配列に格納する

だから私はこのようないくつかのJSONを持っていることがあります。私は追加していので、私は、適切に2つのプリミティブ、1つのint型にこのJSONを解析し、しかし、値3と4を倍増するコードを書かれている

"primitives" : [ 
{ 
"valueType" : "int", 
"value" : 3 
}, 
{ 
"valueType" : "double", 
"value" : 4 
}, 
] 

オブジェクトをJavaのInteger型とDouble型にオートボックスすることを期待するArrayListに渡します。私は通常のJava Arrayを使用することを考えましたが、同じ問題がある場合は​​のような要素タイプを指定する問題があります。あまりにも具体的な場合はint[]です。

このJSONを適切なプリミティブの配列に解析できるようにするJava内の機能はありますか?

私が考えている解決策は、プロパティとしてすべての異なるプリミティブを持つオブジェクトですが、言語レベルのパスが利用可能な場合は複雑すぎるようです。

+0

特定のタイプを知る必要があるように思われるので、どのように値を取得しますか?たとえば、 'int value1 = SomeArray [0]'、 'double value2 = SomeArray [1]'は、値の型を知る必要があるようです。 – KevinO

+0

'Object [] arr'の問題は何ですか? –

+1

[Jackson](https://github.com/FasterXML/jackson-core)や別のJSONパーサーを使ってみませんか?ホイールを再開発し、冗長タイプ情報をJSONに追加しています。 – elhefe

答えて

2

元の順序(1つの配列)を保持することが重要であり、型の追跡が重要であり、JSONパーサーを使用できないことを想定すると、次のようなものが考えられます。

enum ValueType { INT, DOUBLE, FLOAT }; 

static abstract class ParsedValue<T> 
{ 
    private final T data; 
    private final ValueType type; 

    public ParsedValue(T val, ValueType t) 
    { 
     data = val; 
     type = t; 
    } 

    public ValueType getType() 
    { 
     return type; 
    } 

    public T getValue() 
    { 
     return data; 
    } 
} 

static class IntParsedValue extends ParsedValue<Integer> 
{ 
    public IntParsedValue(Integer val) 
    { 
     super(val, ValueType.INT); 
    } 
} 

static class DoubleParsedValue extends ParsedValue<Double> 
{ 
    public DoubleParsedValue(Double val) 
    { 
     super(val, ValueType.DOUBLE); 
    } 
} 


public static void main(String[] args) 
{ 
    List<ParsedValue<?>> lst = new ArrayList<>(); 

    Random rnd = new Random(); 

    for (int i = 0; i < 25; ++i) { 
     ParsedValue<?> pv;    
     if (rnd.nextInt(2) == 0) { 
      pv = new IntParsedValue(rnd.nextInt(500)); 
     } 
     else { 
      pv = new DoubleParsedValue(rnd.nextDouble()); 
     } 

     lst.add(pv); 
    } 

    for (ParsedValue<?> pv : lst) { 
     switch (pv.getType()) { 
     case INT: 
      System.out.println("Integer: " + pv.getValue()); 
      break; 

     case DOUBLE: 
      System.out.println("Double: " + pv.getValue()); 
      break; 

     case FLOAT: 
      //... 
      break; 
     } 


    } 

} 
+0

あなたは基本的に私の質問の終わりに私が提案した考え方を広げました。助けてくれてありがとう、私はおそらくこれを私のアプローチに取り入れます。列挙型を設定するサブクラスは、私が考えなかったかもしれない素敵な感触です。この答えに感謝します。 –

関連する問題