2014-11-07 4 views
0

я пытаюсь создать patchRequest формата:GSON создания массива объектов

'[ 
{ 
    "op": "replace", 
    "path": "/path1", 
    "value": "val1" 
}, 
{ 
    "op": "replace", 
    "path": "/path2", 
    "value": [ 
     { 
      "name": "val2" 
     } 
    ] 
} 
]' 

Я пробовал много глупых вещей, как создание 2 объекта JSON и пытается добавить их в объект patchRequest. ИЛИ пытаться создать 2 patchRequestObj, а затем добавить их в список patchRequest (который побеждает цель, так как я использую patchRequest в качестве моего ввода). patchReq объекты для JsonObjects, добавить в JSONArray и преобразовать обратно в patchRequest (это не удается).

Не удалось найти документацию, полезную для моего дела. Может ли кто-нибудь предложить мне то же самое.

Спасибо.

+0

Вы можете использовать типы POJO? Просто создайте 'Patch []' или 'List ' и сериализуйте это. –

+0

Это список, содержащий два Карты. Один из Карт содержит элемент, который представляет собой Список, содержащий единственную карту с одним элементом. –

ответ

0

Как я понимаю, логика;

  1. Если имеется только одно значение, value JSON тег должен быть примитивным строка.
  2. Если существует несколько значений, value json tag должен быть массив объектов, который имеет name полей.

enter image description here

В этом случае вы можете написать пользовательские TypeAdapter:

public class ValueTypeAdapter extends TypeAdapter<Value> { 

    @Override 
    public Value read(JsonReader in) throws IOException { 
     Value value = null; 

     JsonParser jsonParser = new JsonParser(); 
     JsonElement je = jsonParser.parse(in); 

     if(je instanceof JsonPrimitive) { 
      value = new Value(); 
      value.nameArr = new String[1]; 
      value.nameArr[0] = ((JsonPrimitive)je).getAsString(); 
     } else if (je instanceof JsonArray) { 
      JsonArray jsonArr = (JsonArray)je; 
      value = new Value(); 
      value.nameArr = new String[jsonArr.size()]; 
      for (int i = 0; i < jsonArr.size(); i++) { 
       JsonObject jo = (JsonObject)jsonArr.get(i); 
       value.nameArr[i] = jo.get("name").getAsString(); 
      } 
     } 

     return value; 
    } 

    @Override 
    public void write(JsonWriter out, Value value) throws IOException { 
     if (value != null) { 
      if (value.nameArr != null && value.nameArr.length > 0) { 
       if (value.nameArr.length == 1) { 
        out.value(value.nameArr[0]); 
       } else if (value.nameArr.length > 1) { 
        out.beginArray(); 
        for (String nameVal : value.nameArr) { 
         out.beginObject(); 
         out.name("name").value(nameVal); 
         out.endObject(); 
        } 
        out.endArray(); 
       } 
      } 
     } 
    }  
} 

Ваш POJO:

public class Item { 
    private String op; 
    private String path; 
    private Value value; 

    // TODO: Add Getters/Setters 
} 

public class Value { 
    private String[] nameArr; 

    // TODO: Add Getters/Setters 
} 

Тест:

Примечание: Я использовал аналогичную строку json. Разница - это второй элемент массива, который содержит 2 значения. В этом тесте вы увидите, что десериализация будет выполнена, и itemArr будет заполнено правильно. Также после сериализации itemArr в строку json вы увидите, что результат будет таким же, как и для входящего тестового значения json string.

String json = "[{\"op\":\"replace\",\"path\":\"/path1\",\"value\":\"val1\"},{\"op\":\"replace\",\"path\":\"/path2\",\"value\":[{\"name\":\"val2\"},{\"name\":\"val3\"}]}]"; 

    GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.registerTypeAdapter(Value.class, new ValueTypeAdapter()); 
    Gson gson = gsonBuilder.create(); 

    Item[] itemArr = gson.fromJson(json, Item[].class); 

    String serialized = gson.toJson(itemArr); 

    System.out.println("serialized:" + serialized); 
    // NOTE: serialized output is same with incoming test value 

Подробнее о TypeAdapters можно узнать из this site.

0

В псевдокоде:

mainArray = new JsonArray(); 
firstObject = new JsonObject(); 
firstObject.add("op", "replace"); 
firstObject.add("path", "/path1"); 
firstObject.add("value", "val1"); 
mainArray.add(firstObject); 
secondObject = new JsonObject(); 
secondObject.add("op", "replace"); 
secondObject.add("path", "/path2"); 
innerArray = new JsonArray(); 
innerObject = new JsonObject(); 
innerObject.add("name", "val2"); 
innerArray.add(innerObject); 
secondObject.add("value", innerArray); 
mainArray.add(secondObject); 
jsonString = mainArray.toJsonString(); 
Смежные вопросы