2009-07-17 11 views
8

युक्त एक-तत्व शब्दकोशों की एक सरणी मिलती है, मैं एक परियोजना पर काम कर रहा हूं जो वस्तुओं को जेएसओएन में परिवर्तित करने के लिए जर्सी का उपयोग करता है। मैं, नेस्टेड सूचियों को लिखने के लिए सक्षम होने के लिए तो जैसे चाहते हैं:मैं जर्सी का उपयोग कर जेएसओएन के रूप में मार्शल नेस्टेड सूचियां कैसे करूं? मुझे एक सरणी या सरणी

{"data":[["one", "two", "three"], ["a", "b", "c"]]} 

वस्तु मैं पहली बार कन्वर्ट करने के लिए एक < LinkedList < LinkedList < स्ट्रिंग > > > के रूप में डेटा का प्रतिनिधित्व करना चाहते हैं, और मैं जर्सी लगा सिर्फ सही काम करेगा। ऊपर nulls की एक सूची के रूप में उत्पादन किया गया था:

{"data":[null, null]} 

पढ़ने कि नेस्टेड वस्तुओं लिपटे होने की जरूरत है के बाद, मैं करने की कोशिश की है:

@XmlRootElement(name = "foo") 
@XmlType(propOrder = {"data"}) 
public class Foo 
{ 
    private Collection<FooData> data = new LinkedList<FooData>(); 

    @XmlElement(name = "data") 
    public Collection<FooData> getData() 
    { 
     return data; 
    } 

    public void addData(Collection data) 
    { 
     FooData d = new FooData(); 
     for(Object o: data) 
     { 
      d.getData().add(o == null ? (String)o : o.toString()); 
     } 
     this.data.add(d); 
    } 

    @XmlRootElement(name = "FooData") 
    public static class FooData 
    { 
     private Collection<String> data = new LinkedList<String>(); 

     @XmlElement 
     public Collection<String> getData() 
     { 
      return data; 
     } 
    } 
} 

कि कोड आउटपुट क्या, नीचे दिए गए है जो के करीब है क्या मैं चाहता हूं:

{"data":[{"data":["one", "two", "three"]},{"data":["a", "b", "c"]}]} 

मैं चाहता हूं कि पहला डेटा सूचियों की सूची हो, न कि एक-तत्व शब्दकोशों की सूची। मुझे यह कैसे हासिल होगा?

यहाँ मेरी JAXBContentResolver है:

@Provider 
public class JAXBContextResolver implements ContextResolver<JAXBContext> 
{ 
    private JAXBContext context; 
    private Set<Class<?>> types; 

    // Only parent classes are required here. Nested classes are implicit. 
    protected Class<?>[] classTypes = new Class[] {Foo.class}; 

    protected Set<String> jsonArray = new HashSet<String>(1) { 
     { 
      add("data"); 
     } 
    }; 

    public JAXBContextResolver() throws Exception 
    {   
     Map<String, Object> props = new HashMap<String, Object>(); 
     props.put(JSONJAXBContext.JSON_NOTATION, JSONJAXBContext.JSONNotation.MAPPED); 
     props.put(JSONJAXBContext.JSON_ROOT_UNWRAPPING, Boolean.TRUE); 
     props.put(JSONJAXBContext.JSON_ARRAYS, jsonArray); 
     this.types = new HashSet<Class<?>>(Arrays.asList(classTypes)); 
     this.context = new JSONJAXBContext(classTyes, props); 
    } 

    public JAXBContext getContext(Class<?> objectType) 
    { 
     return (types.contains(objectType)) ? context : null; 
    } 
} 

उत्तर

5

आप की कोशिश की है जर्सी-json ??

अपने classpath (या अपने Maven निर्भरता) को जर्सी-json जोड़े

फिर इस का उपयोग करें:

@Provider 
public class JAXBContextResolver implements ContextResolver<JAXBContext> { 

    private final JAXBContext context; 

    public JAXBContextResolver() throws Exception { 
     this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), "package.of.your.model"); 
    } 

    public JAXBContext getContext(Class<?> objectType) { 
     return context; 
    } 

} 

आप केवल अपने ressources में कुछ इस तरह की जरूरत है (मान DetailProduit अपने वस्तु है आप करना चाहते हैं क्रमानुसार और DetailProduit.java JAXB टैग और package.of.your.model में)

@GET 
@Produces(MediaType.APPLICATION_JSON) 
@Path("/{code}") 
public DetailProduit getDetailProduit(@PathParam("code") String code) { 
     .... Your Code ........ 
    } 
+0

ठीक है, मैंने अभी अनुमान लगाया है कि आपका मामला मुझसे अधिक जटिल था हालांकि ... – Arnaudweb

0

मैं जानता हूँ कि qustion बल्कि पुरानी है, लेकिन मैं एक ऐसी ही समस्या पर ठोकर खाई लेकिन मैं एक डाटाबेस जो मैं से मिला से एक परिणाम के कारण सरणी ie.'List' की एक सूची प्रस्तुत करना चाहता था जेपीए और संस्थाओं का उपयोग किए बिना एक नाटिव क्वेरी।

यह मैं कैसे इसे हल है:

पहले एक ListWrapper बनाया गया।जावा:

@GET 
    @Path("/{id}/search") 
    @Produces(JSON) 
    public ListWrapper search(@PathParam("id") Integer projectId) { 
     return DatabaseManager.search(projectId); 
    } 

खोज विधि एक सूची के साथ एक Listwrapper लौटा रहा है:

import java.util.ArrayList; 
import java.util.List; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class ListWrapper extends ArrayList { 

    @SuppressWarnings("unchecked") 
    public ListWrapper() { 
     super(); 
    } 

    public ListWrapper(List list) { 
     super(list); 
    } 
} 

और फिर मैं एक वर्ग AbstractMessageReaderWriterProvider

import org.codehaus.jettison.json.JSONArray; 
import org.codehaus.jettison.json.JSONException; 

import com.sun.jersey.core.provider.AbstractMessageReaderWriterProvider; 

@Provider 
@Produces("*/*") 
@Consumes("*/*") 
public class ListObjectArrayMessagereaderWriterProvider extends AbstractMessageReaderWriterProvider<ListWrapper> { 

    public boolean supports(Class type) { 
     return type == ListWrapper.class; 
    } 

    @Override 
    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { 
     return type == ListWrapper.class; 
    } 

    @Override 
    public ListWrapper readFrom(Class<ListWrapper> type, Type genericType, Annotation[] annotations, MediaType mediaType, 
     MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException { 
     throw new IllegalArgumentException("Not implemented yet."); 
    } 

    @Override 
    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { 
     return type == ListWrapper.class; 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public void writeTo(ListWrapper t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, 
     MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { 

     final Iterator<Object[]> iterator = t.iterator(); 

     OutputStreamWriter writer = new OutputStreamWriter(entityStream, getCharset(mediaType)); 
     final JSONArray jsonArrayOuter = new JSONArray(); 
     while (iterator.hasNext()) { 
      final Object[] objs = iterator.next(); 
      JSONArray jsonArrayInner = new JSONArray(Arrays.asList(objs)); 
      jsonArrayOuter.put(jsonArrayInner); 
     } 
     try { 
      jsonArrayOuter.write(writer); 
      writer.write("\n"); 
      writer.flush(); 
     } catch (JSONException je) { 
      throw new WebApplicationException(new Exception(ImplMessages.ERROR_WRITING_JSON_ARRAY(), je), 500); 
     } 
    } 
} 

का विस्तार तो मैं इस के रूप में एक में यह उपयोग कर बनाई गई ऑब्जेक्ट []

आशा है कि यह किसी की सहायता करे :-)

संबंधित मुद्दे