2015-05-26 2 views
0

Контекст: Я работаю над сервисом среднего человека, который действует как система CMS. Я получаю полный комплексный json-файл, сброшенный на моем сервере, который затем мне нужно обслуживать для моих клиентов, которые ожидают json-контента. (пока не будем рассматривать часть проверки)Анализ вложенных данных json в строку

У меня есть поля имени, версии и содержимого, которые существуют на верхнем уровне. Контент (главы) существует как массив вложенных сложных объектов (~ 5 уровней в глубину).

{ 
    "name": "MyCourse", 
    "version": 12345, 
    "chapters": [ 
    { 
     "name": "Chapter01", 
     "content": { 
     "menu": { 
      "id": "Chapter01_EndMenu", 
      "file": "ch1_end_op.wav" 
     }, 
     "score": { 
      "id": "Chapter01_Score", 
      "files": [.... 

То, что я пытался (и работает): Строительство мой POJO, чтобы отразить структуру JSon, где содержание (главы) существует в виде списка сложных объектов. Вызов gson parser на этом работает.

То, что я пытаюсь сделать: Есть более простой POJO с только именем, версией и содержанием, где содержание только хранит представление в виде массива (главы и вложенные объекты) в виде строки.

Я попытался определить свое поле содержимого в pojo как String и задать аннотацию @SerializedName, чтобы заставить gson анализировать массив как строку в нем, но это не работает.

Возможно ли частично получить json как поля и получить остальное (вложенного массива) в поле строки в моем pojo?

+0

Вы хотите, чтобы строка 'chapters' json была в строковой переменной POJO' content' правильно? –

+0

да, это правильно. Массив глав почти слишком глубокий, и слишком много накладных расходов (вложенное pojo-wise) для поддержания, учитывая, что это никак не влияет на мою услугу. – kosh

ответ

2

Это просто в JSONObject вы можете получить строку JSON, поскольку она использует ключи.

String jsonString = "{ \"name\": \"MyCourse\", \"version\": 12345, \"chapters\": [ {  \"name\": \"Chapter01\"}]}"; 
JSONObject jsonObject = new JSONObject(jsonString); 
Details details = new Details(); 
details.setName(jsonObject.get("name")); 
details.setVersion(jsonObject.get("version")); 
details.setChapters(jsonObject.get("chapters")); 

Вы можете попробовать это.

0

Вы можете определить свой собственный адаптер для типа данных String.

E. g. :

GsonBuilder builder = new GsonBuilder(); 
builder.registerTypeAdapter(String.class, new JsonDeserializer<String>() { 
       public String deserialize(JsonElement json, Type typeOfT, 
         JsonDeserializationContext context) 
         throws JsonParseException { 
        return json.toString(); 
       } 
}); 

Gson gson = builder.create(); 

Теперь он может хранить данные глав как строки.

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