2016-04-11 3 views
0

Мой код ниже, чтобы генерировать JSON с помощью Джексона, прекрасно до тех пор, пока данные обеспокоены, но не в формате JSONСоздать действительный JSON с помощью Джексона, который содержит массив и настраиваемое поле

Сформированный JSON оленья кожа перейдите JSONLint, потому что он получил цитаты вокруг квадратных скобок и цитаты вокруг запятых. Это также обратные косые, которые я взломан из него - но Im уверен, что там что-то не так с тем, что Im делает ниже

Вот то, что я пытаюсь сделать:

JSON должен выглядеть следующим образом (с исключение из skip поля, которое я добавил здесь, чтобы подчеркнуть, что он будет исключен из объекта при сериализованном):

{ 
    "users": [{ 
     "foo": "abc1", 
     "bar": "def1", 
     "skip": "this field is skipped" 
    }, { 
     "foo": "abc2", 
     "bar": "def2", 
     "skip": "this field is skipped" 
    }], 
    "uri": "/users" 
} 

Пользователи Key представляет собой массив пользователей - 2-х элементов, показанных выше. Поле пропуска не должна быть частью окончательного JSON, но его часть каждого пользователя «» объекта добавляется

поля URI

Моего код находится ниже. Он успешно пропускает поле «skip», и он успешно строит строку, которая является почти JSON, если будет устранено странное форматирование. Но я признаю, что этот код ужасен, и это может быть лучше (хотя я не знаю, как с Im im к этому)

Какое неудобство вы спрашиваете?

  1. слэш (что вы можете видеть я устранил с помощью hackey регулярных выражений)
  2. Котировки вокруг [и]
  3. Котировки вокруг, (запятая)

Код:

get("/users", (request, response) -> { 
    //this is the array of objects 
    Object[] allUsers = listenUp.get_all_users(); 

    //Ignore this field per ListenUpUser object 
    String[] ignorableFieldNames = { "skip" }; 

    ObjectMapper mapper = new ObjectMapper(); 
    mapper.enable(SerializationFeature.INDENT_OUTPUT); 

    mapper.addMixIn(Object.class, PropertyFilterMixIn.class); 
    FilterProvider filters = new SimpleFilterProvider() 
      .addFilter("filter properties by name", 
        SimpleBeanPropertyFilter.serializeAllExcept(
          ignorableFieldNames)); 
    ObjectWriter writer = mapper.writer(filters); 

    ArrayNode array = mapper.createArrayNode(); 

    for(int i = 0; i < allUsers.length; i++) { 
     array.add(writer.writeValueAsString(allUsers[i])); 
    } 

    JsonNodeFactory nodeFactory = JsonNodeFactory.instance; 
    ObjectNode child = mapper.createObjectNode(); 
    child.put("users", array.toString()); 
    child.put("uri", "/users"); 
    response.status(200); 
    response.type("application/json"); 
    String a = child.toString().replaceAll("\\\\", ""); 
    return a; 
}); 

Это определено в верхней части файла (для логики поля пропуска)

@JsonFilter("filter properties by name") 
class PropertyFilterMixIn {} 
+0

Если вы не хотите кавычки в списке, то почему вы делаете 'child.put («пользователи» , array.toString()); '? Просто поместите 'array', а не его строку –

+0

Yup Я попытался это сделать, и результат еще больше bizzare: http://pastebin.com/fAfUcv92 – wrecktangle

+0

Если вы используете Джексон, я не понимаю, почему вы вручную создаете класс JsonObject для вас. Просто используйте функцию сериализации Jackson –

ответ

1

Я думаю, вы можете использовать Hashmap<String, Object>. Джексон поймет, как применить фильтр к Object в массиве и просто пропустить любой другой объект (String/array), который он находит. Вот демо, который работает для меня:

import com.fasterxml.jackson.annotation.JsonFilter; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.SerializationFeature; 
import com.fasterxml.jackson.databind.ser.FilterProvider; 
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; 
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; 
import org.json.JSONException; 

import java.io.IOException; 
import java.util.HashMap; 

public class test12 { 
    public static void main(String[] args) throws IOException, JSONException { 
     Object[] allUsers = get_all_users(); 

     String[] ignorableFieldNames = {"skip"}; 

     ObjectMapper mapper = new ObjectMapper(); 
     mapper.enable(SerializationFeature.INDENT_OUTPUT); 

     mapper.addMixIn(Object.class, PropertyFilterMixIn.class); 
     FilterProvider filters = new SimpleFilterProvider() 
       .addFilter("filter properties by name", 
         SimpleBeanPropertyFilter.serializeAllExcept(
           ignorableFieldNames)); 
     mapper.setFilterProvider(filters); 

     HashMap<String, Object> map = new HashMap<String, Object>(); 
     map.put("users", allUsers); 
     map.put("uri", "/users"); 
     String result = mapper.writeValueAsString(map); 

     System.out.println(result); 
    } 

    @JsonFilter("filter properties by name") 
    public static class PropertyFilterMixIn { 
    } 

    private static Object[] get_all_users() { 
     User user1 = new User(); 
     user1.foo = "abc1"; 
     user1.bar = "def1"; 
     user1.skip = "this field is skipped"; 
     User user2 = new User(); 
     user2.foo = "abc2"; 
     user2.bar = "def2"; 
     user2.skip = "this field is skipped"; 
     return new Object[]{user1, user2}; 
    } 

    public static class User { 
     public String foo; 
     public String bar; 
     public String skip; 
    } 
} 

Результат:

{ 
    "users" : [ { 
    "foo" : "abc1", 
    "bar" : "def1" 
    }, { 
    "foo" : "abc2", 
    "bar" : "def2" 
    } ], 
    "uri" : "/users" 
} 
+0

Вот оно! Благодаря тонну! – wrecktangle

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