2017-03-09 10 views
1

私はObjectMapperリストクラスで回復するこのプロパティPROP1とPROP2ObjectMapper readValue

を持つクラスを持っているテキスト形式

{ 
    "sources": [{ 
      "prop1": "1", 
      "prop2": "2" 

     }, 
     { 
      "prop1": "1", 
      "prop2": "2" 

     }, 
    ], 
    "redirection": [{ 
      "prop1": "1", 
      "prop2": "2" 

     } 
    ] 
} 

でressourceファイルJSON をロードします。どのような方法?

このコードは動作しません....お使いの場合には、あなたの助け

答えて

1

ため

Map<String, Object> mp = mapper.readValue(jsonResource.getInputStream(),new TypeReference<Map<String, Object>>() {}); 
String sourceText= new ObjectMapper().readTree(jsonResource.getInputStream()).get("sources").asText(); 

mapper.readValue(sourceText, new TypeReference<List<MyClass>>(){}); 

おかげで、私は、カスタムJsonDeserializerを記述します。実際にコードをテストしたが、私はアイデアは明らかだと思うしていない:

final MyClassDeserializer myClassDeserializer = new MyClassDeserializer(); 
    final SimpleModule deserializerModule = new SimpleModule(); 
    deserializerModule.addDeserializer(MyClass.class, myClassDeserializer); 

    final ObjectMapper mapper = new ObjectMapper(); 
    mapper.registerModule(deserializerModule); 

そしてJsonDeserializerのためのコード:

public class MyClassDeserializer extends JsonDeserializer<MyClass> { 

    @Override 
    public MyClass deserialize(final JsonParser jsonParser, final DeserializationContext context) 
      throws IOException { 
     final JsonNode node = jsonParser.getCodec().readTree(jsonParser); 
     final JsonNode sourcesNode = node.get("sources"); 
     if(node.isArray()) { 
      final ArrayNode arrayNode = (ArrayNode) node; 
      final Iterable<JsonNode> nodes = arrayNode::elements; 
      final Set<Source> set = StreamSupport.stream(nodes.spliterator(), false) 
        .map(mapper) 
        .collect(Collectors.toSet()); 
      ... 
     } 

     ... 
    } 
+0

私はすべてを理解していないが、私たちはテキストノードを持つことができないしようとしますか? – lg0173

+0

あなたはテキストノードを持つことができますが、それは 'String'でしょう。私のアプローチでは、「ソース」オブジェクトを作成するだけで、より良いと思います。 –

0

まず最初:あなたのJSONが無効です。 sources配列の2番目のオブジェクトの後にカンマがあります。これは削除する必要があります。

2番目:結果に適切なタイプを選択しなかったと思います。 JSONが表すのは、文字列からオブジェクトの配列にマップするマップです。だから、タイプは、あなたがObjectMappergetTypeFactory()メソッドを使用してMapTypeを構築し、使用して値をデシリアライズすることができ、これらの考慮事項でMap<String, Props[]>のようなもの(あなたがあなたのクラスの名前を提供しなかったので、私はPropsそれを呼んだ。

する必要があります以下のように構築タイプのような

ObjectMapper mapper = new ObjectMapper(); 
TypeFactory typeFactory = mapper.getTypeFactory(); 
MapType mapType = typeFactory.constructMapType(HashMap.class, String.class, Props[].class); 
Map<String, Props[]> map = mapper.readValue(s, mapType); 
0

私は実際には他の回答に投票したが、これは私の考えで、クラスを作成し、ジャクソンは仕事をやらせるために:。

public class ResourceTest { 

    @Test 
    public void test1() throws IOException { 
     assertTrue(true); 

     Resource resource = new Resource(); 

     resource.getRedirectrions().add(makeRedirectrion("rprop11", "rprop12")); 
     resource.getRedirectrions().add(makeRedirectrion("rprop21", "rprop22")); 

     resource.getSources().add(makeSource("sprop11","sprop12")); 
     resource.getSources().add(makeSource("sprop21","sprop22")); 

     String json = new ObjectMapper().writeValueAsString(resource); 
     System.out.println(json); 

     Resource resource1 = new ObjectMapper().readValue(json, Resource.class); 
     System.out.println(resource1); 
    } 

    private Source makeSource(String prop1, String prop2) { 
     Source source = new Source(); 
     source.setProp1(prop1); 
     source.setProp2(prop2); 
     return source; 
    } 

    private Redirectrion makeRedirectrion(String prop1, String prop2) { 
     Redirectrion redirectrion = new Redirectrion(); 
     redirectrion.setProp1(prop1); 
     redirectrion.setProp2(prop2); 
     return redirectrion; 
    } 

} 

出力は次のとおりです。

{"sources":[{"prop1":"sprop11","prop2":"sprop12"},{"prop1":"sprop21","prop2":"sprop22"}],"redirectrions":[{"prop1":"rprop11","prop2":"rprop12"},{"prop1":"rprop21","prop2":"rprop22"}]} 
Resource{sources=[Source{prop1='sprop11', prop2='sprop12'}, Source{prop1='sprop21', prop2='sprop22'}], redirectrions=[Source{prop1='rprop11', prop2='rprop12'}, Source{prop1='rprop21', prop2='rprop22'}]} 
関連する問題