Используя JAXB для неупорядочивания/упорядочивания Списка <Строка>

ответ таков: вы не можете использовать JavaScriptConverter таким образом ... у него нет возможностей.

но для справки:

Как мне отформатировать дату Microsoft JSON? http://blog.stevenlevithan.com/archives/date-time-format

Если вам не безразлично, то, что я закончил, добавило метод к прототипу строки javascript, чтобы мне было проще в коде:

String.prototype.dateFromJSON = function () {
    return eval(this.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
};

это все еще трудно использовать в смысл кода, потому что вы должны постоянно вызывать dateFromJSON () везде ... что глупо.

45
задан User1 21 October 2009 в 20:35
поделиться

4 ответа

Я использовал пример @LiorH и расширил его до:


@XmlRootElement(name="List")
public class JaxbList<T>{
    protected List<T> list;

    public JaxbList(){}

    public JaxbList(List<T> list){
        this.list=list;
    }

    @XmlElement(name="Item")
    public List<T> getList(){
        return list;
    }
}

Обратите внимание, что он использует дженерики, поэтому вы можете использовать его с другими классами, кроме String. Теперь код приложения прост:


    @GET
    @Path("/test2")
    public JaxbList test2(){
        List list=new Vector();
        list.add("a");
        list.add("b");
        return new JaxbList(list);
    }

Почему этого простого класса нет в пакете JAXB? Кто-нибудь видел что-нибудь подобное в другом месте?

46
ответ дан 26 November 2019 в 20:57
поделиться

I столкнувшись с этим шаблоном несколько раз, я обнаружил, что самый простой способ - определить внутренний класс с аннотациями JaxB. (в любом случае вы, вероятно, захотите определить имя корневого тега)

, чтобы ваш код выглядел примерно так

@GET
@Path("/test2")
public Object test2(){
   MyResourceWrapper wrapper = new MyResourceWrapper();
   wrapper .add("a");
   wrapper .add("b");
   return wrapper ;
}

@XmlRootElement(name="MyResource")
private static class MyResourceWrapper {
       @XmlElement(name="Item")
       List<String> list=new ArrayList<String>();
       MyResourceWrapper (){}

       public void add(String s){ list.add(s);}
 }

, если вы работаете с javax.rs (jax-rs), я бы вернул объект Response с оболочкой установить в качестве своего объекта

8
ответ дан 26 November 2019 в 20:57
поделиться

Пример User1 у меня сработал. Но, как предупреждение, он не будет работать ни с чем, кроме простых типов String / Integer, если вы не добавите аннотацию @XmlSeeAlso:

@XmlRootElement(name = "List")
@XmlSeeAlso(MovieTicket.class)
public class MovieTicketList {
    protected List<MovieTicket> list;

Это работает нормально, хотя не позволяет мне использовать один общий класс списка во всем моем применение. Это также может объяснить, почему этот, казалось бы, очевидный класс не существует в пакете JAXB.

2
ответ дан 26 November 2019 в 20:57
поделиться
@GET
@Path("/test2")
public Response test2(){
   List<String> list=new Vector<String>();
   list.add("a");
   list.add("b");

   final GenericEntity<List<String>> entity = new GenericEntity<List<String>>(list) { };
   return Response.ok().entity(entity).build();
}
32
ответ дан 26 November 2019 в 20:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: