2016-05-30 1 views
0

Я использую стороннюю библиотеку (точнее, Elasticsearch 2.3.3), которая уже анализирует данную структуру JSON в экземпляре Map<String,Object> для меня , и я хочу, чтобы создать экземпляр класса объекта, который был первоначально в формате JSON сортируются,:Jackson JSON: Unmarshalling Map <String, Object> атрибутов обратно в его исходный класс

  1. Ранжирование:MarshallableObjectmarshalled_object.json
  2. немаршалинг:marshalled_object.jsonMap<String,Object>MarshallableObject)

Кроме того, здесь есть несколько примеров кода, иллюстрирующий логику:

import java.net.InetAddress; 
import java.net.UnknownHostException; 
import java.util.Arrays; 
import java.util.Map; 
import java.util.stream.Stream; 

import org.elasticsearch.action.search.SearchResponse; 
import org.elasticsearch.client.transport.TransportClient; 
import org.elasticsearch.common.transport.InetSocketTransportAddress; 
import org.elasticsearch.index.query.QueryBuilders; 

import com.fasterxml.jackson.databind.ObjectMapper; 

public final class AttrMapUnmarshallingTest { 

    /** 
    * This class was directly used in the process for creating JSON documents indexed by Elasticsearch 
    */ 
    public static final class MarshallableObject { 

     public String bar; 

     public String foo; 

    } 

    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); 

    public static void main(final String[] args) throws UnknownHostException { 
     try (final TransportClient client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getLoopbackAddress(), 9300))) { 

      final SearchResponse response = client.prepareSearch("news").setTypes("article") 
       .setQuery(QueryBuilders.matchQuery("text", "advertisement")).execute().actionGet(); 
     final Stream<Map<String, Object>> attrMaps = Arrays.stream(response.getHits().getHits()) 
       .map(hit -> hit.sourceAsMap()); 
     final Stream<MarshallableObject> objs = attrMaps.map(attrMap -> { 
      // TODO: Find way of converting attr map into original class 
      // which was marshalled into JSON 
      // final MarshallableObject obj = OBJECT_MAPPER.read(attrMap); 
      }); 
     } 
    } 

} 

ответ

0

Я некоторое чтение на SearchHit класса, и это то, что я думаю, может работать:

Stream<MarshallableObject> objs = Arrays.stream(response.getHits().getHits()) 
    .filter(hit->hit.hasSource()) // For some reason source could be null. 
    .map(hit-> 
     OBJECT_MAPPER.readValue(hit.sourceAsString(), 
           MarshallableObject.class)); 

Примечание: Вам необходимо объявить MarshallableObject класс static, чтобы выполнить чтение. По-видимому, скрытая ссылка ParentClass$this не может быть восстановлена ​​из строки json.

Удачи.

+0

Да, я видел метод org.elasticsearch.search.SearchHit.getSourceAsString() и надеялся, что можно повторно использовать карту. Я полагаю, возможно, не ... – errantlinguist

+0

** Замечание из отдаленного будущего: ** Поскольку кажется невозможным использовать «Карта», созданную классом «SearchHit», вероятно, лучше использовать 'SearchHit.sourceRef()' для unmarshalling, потому что 'sourceAsString()' фактически вызывает прежний метод, но затем фактически выполняет свою собственную обработку JSON на результат 'sourceRef()', чтобы создать строку. – errantlinguist

Смежные вопросы