2014-01-21 3 views
1

У меня есть карта объектов JSON следующим образом:Как преобразовать карту объектов JSON в JSON с использованием GSON в Java?

Map<String,Object> map = HashMap<String,Object>(); 
map.put("first_name", "prod"); 
JSONObject jsonObj = new JSONObject("some complex json string here"); 
map.put("data", jsonObj); 

Gson gson = new Gson(); 
String result = gson.toJson(map); 

Теперь, если «какой-то комплекс JSON строка здесь» было:

{"sender":{"id":"test test"},"recipients":{"id":"test1 test1"} } 

и выполнить выше код дает мне что-то вроде:

{ 
    "first_name": "prod", 
    "data": { 
     "map": { 
      "sender": { 
       "map": { 
        "id": "test test" 
        } 
       } 
      }, 
      "recipients": { 
       "map": { 
        "id": "test1 test1" 
       } 
      } 
     } 
    } 
} 

Возможно, у меня есть синтаксическая ошибка, но в основном я не знаю, почему я вижу объекты, обернутые вокруг map.

Update

согласно комментариям, это плохая идея, чтобы смешивать различные парсеры JSon. Я могу это понять. но мой случай требует вызова внешнего api, который принимает хэш-карту объектов, которые десериализуются с помощью gson в конечном итоге.

Есть ли какие-либо другие засады для объектов JSONObject, которые я могу добавить на карту, и у вас есть gson, чтобы создать json из него без дополнительной структуры «карты»? Я понимаю, что я могу создать java beans и достичь этого. но я ищу более простой способ, так как моя структура данных может быть сложной.

Update2

собирается один шаг назад, я даюсь строку XML. и я преобразовал их в объект json. теперь я должен использовать внешний api, который берет карту, которая, в свою очередь, преобразуется в строку json, используя gson во внешней службе.

поэтому мне дана структура данных xml, но мне нужно передать карту этой функции. способ, описанный выше, создает дополнительные структуры «map» при преобразовании в json-строку с использованием gson. У меня нет контроля, чтобы изменить поведение внешней службы (например, с помощью gson для преобразования карты).

+0

смесительных классы из двух разных разбора библиотек JSON это рецепт катастрофы. –

+0

Вам нужно будет предоставить нам пример содержимого «HashMap» и того, что вы хотите добавить к нему. Не совсем понятно, что вы хотите. –

+0

Я пытаюсь создать hashmap, который может быть преобразован в строку json позже, используя gson. но для моей потребности мне нужно создать эту карту, а не строку json. мне просто нужно знать, что эта карта «может» быть преобразована в строку json с использованием gson с добавлением «map» –

ответ

3

Смешивание классов из двух различных библиотек JSON закончится ничем, кроме слез. И это ваша проблема; JSONObject не входит в состав Gson. Кроме того, попытка сочетания структур данных Java с представлениями дерева синтаксического анализа также является плохой идеей; концептуально объект в JSON - карта.

Если вы собираетесь использовать Gson, либо использовать все объекты Java и пусть Gson преобразовать их или использовать классы из Gson:

JsonObject root = new JsonObject(); 
root.addProperty("first_name", "prod"); 

JsonElement element = new JsonParser().parse(complexJsonString); 
root.addProperty("data", element); 

String json = new Gson().toJson(root); 
+0

, в то время как это хорошее решение, мне нужен хэш-массив объектов, которые можно успешно преобразовать в строку json с помощью gson без дополнительной оболочки «map» –

+0

Снова, затем используйте классы Java, а не классы дерева разбора из синтаксического анализатора. Непонятно, что вы теперь просите, так как выше выдает * точно * то, что вы сказали, что хотите. –

+0

Чтобы быть ясным: вы либо работаете с элементами дерева синтаксического анализа, либо генерируете JSON из дерева, либо работаете с классами Java, а Gson сериализуете их в JSON. Вы можете легко генерировать 'JsonElement' из любой' Map', используя 'Gson.toJsonTree()' –

3

Это связано с внутренней реализацией JSONObject. Сам класс имеет поле экземпляра типа java.util.Map с именем map.

При разборе String

{"sender":{"id":"test test"},"recipients":{"id":"test1 test1"} } 

с JSONObject, вы на самом деле имеете 1 корень JSONObject, два вложенные JSONObject сек, один с именем sender и один с именем recipients.

Иерархия в основном как так

JSONObject.map -> 
    "sender" -> 
      JSONObject.map -> 
        "id" -> "test test", 
    "recipients" -> 
      JSONObject.map -> 
        "id" -> "test test1" 

Gson упорядочивает свои объекты, отображая значение каждого поля для имени поля.


Listen to this man.

And this one.

+1

. Другими словами, не используйте JSON-инструменты. –

3

Я бы с подобной проблемой, и я, наконец, решить ее с помощью json-simple.

HashMap<String, Object> object = new HashMap<String,Object>; 

// Add some values ... 

// And finally convert it 
String objectStr = JSONValue.toJSONString(object); 
0

Вы можете попробовать стандартную реализацию Java API for JSON processing, которая является частью J2EE.

JsonObject obj = Json 
    .createObjectBuilder() 
    .add("first_name", "prod") 
    .add("data", Json.createObjectBuilder() 
    .add("sender", Json.createObjectBuilder().add("id", "test test")) 
    .add("recipients", Json.createObjectBuilder().add("id", "test1 test1"))).build(); 

Map<String, Object> prop = new HashMap<String, Object>() { 
    { 
     put(JsonGenerator.PRETTY_PRINTING, true); 
    } 
}; 
JsonWriter writer = Json.createWriterFactory(prop).createWriter(System.out); 
writer.writeObject(obj); 
writer.close(); 

Вывод должен быть:

{ 
    "first_name":"prod", 
    "data":{ 
     "sender":{ 
      "id":"test test" 
     }, 
     "recipients":{ 
      "id":"test1 test1" 
     } 
    } 
} 
Смежные вопросы