Spring Data Mongodb: строка json в BasicDBObject - PullRequest
0 голосов
/ 22 сентября 2018

Я создал этот пользовательский конвертер:

@Component
@WritingConverter
public class MetadataWriterConverter implements Converter<Metadata, DBObject> {
    @Override
    public DBObject convert(Metadata metadata) {
        DBObject dbObject = new BasicDBObject();
        dbObject.put("name", metadata.getName());
        dbObject.put("metadata", (BasicDBObject) BasicDBObject.parse(reference.getMetadata())); 
        dbObject.removeField("_class");
        return dbObject;
    }
}

Я получаю это исключение:

Причина: org.bson.BsonInvalidOperationException: readStartDocument может вызываться толькокогда CurrentBSONType имеет значение DOCUMENT, а не когда CurrentBSONType имеет значение ARRAY.

Проблема в:

(BasicDBObject) BasicDBObject.parse(metadata.getMetadata())

содержимое metadata.getMetadata: "[{'departament': 'JUST'}]".

Metadata класс:

public class Metadata {
    private String id;
    private String user;
    private String metadata;
}

Содержимое поля metadata представляет собой строку json, я пытаюсь преобразовать в BasicDbObject, но проблема возникает, когда эта строка является jsonмассив: [{},{}].

Угадайте:

Metadata met = new Metadata();
met.setId("Mdt1");
met.setUser("user");
met.setMetadata("[{'departament': 'JUST'}]");

Что я хочу получить:

{
  "id": Mdt1,
  "user": "user",
  "metadata": [{"departament": "JUST"}]
}

Есть идеи о том, как провести рефакторинг моего конвертера?*

1 Ответ

0 голосов
/ 22 сентября 2018

На самом деле, BasicDBObject.parse() ожидает JSONObject вместо JSONArray, который вы передаете в своем примере.Проверьте документы здесь - http://api.mongodb.com/java/current/com/mongodb/BasicDBObject.html#parse-java.lang.String-

Вместо этого вы можете попробовать преобразовать ваш reference.getMetadata() в valid JSON String, а затем использовать BasicDBList для вашего JSONArray.Примерно так:

@Component
@WritingConverter
public class MetadataWriterConverter implements Converter<Metadata, DBObject> 
{
    @Override
    public DBObject convert(Metadata metadata) {
        DBObject dbObject = new BasicDBObject();
        dbObject.put("name", metadata.getName());
        String jsonString = String.format("{\"data\": " + reference.getMetadata() + "}");
        BasicDBObject basicDBObject = (BasicDBObject) BasicDBObject.parse(jsonString);
        BasicDBList parsedList = (BasicDBList) basicDBObject.get("data");
        dbObject.put("metadata", parsedList); 
        dbObject.removeField("_class");
        return dbObject;
    }
}
...