Подтвердить что ты не робот

Джексон читает значение как строку

У меня есть объект с неизвестными значениями, скажем

{
 "data": [
    {"a":...,
    "dont_know_what_else_is_here":....}
 ]
}

И я просто хочу сохранить значение "данных" в виде строки в переменной/базе данных.

Как мне его прочитать из потокового API?

4b9b3361

Ответ 1

Если вы уже прочитали этот объект в JsonNode, вы можете сделать это следующим образом:

String content = jsonNode.get("data").textValue();

UPD: поскольку вы используете потоковой парсер, этот пример использования Джексона может помочь.

UPD: имя метода теперь textValue() - docs

Ответ 2

Вы можете получить данные на карте в соответствии с парами значений ключей.

Map<String, Object> mp = mapper.readValue(new File("xyz.txt"),new TypeReference<Map<String, Object>>() {});

Теперь получите значение из карты:

mp.get("data");

Ответ 3

У вас может быть класс Entity для результата JSON.

String json = "your_json";
ObjectMapper mapper = new ObjectMapper();
Entity entity = mapper .readValue(json, Entity.class);
// here you can do everything with entity as you wish

// to write Entity value as String when you wish
String text = mapper.writeValueAsString(object);
// to write Entity child value as String when you wish (let data contain data part)
String data = mapper.writeValueAsString(object.getData());

Ответ 4

Когда мы пытаемся извлечь данные в виде строки из JsonNode, мы обычно используем asText, но вместо этого мы должны использовать textValue.

asText: метод, который вернет действительное строковое представление значения контейнера, если node - значение node (метод isValueNode() возвращает true), в противном случае пустая строка.

textValue: метод, используемый для доступа к строковым значениям. НЕ делает никаких конверсий для узлов, отличных от String; для значений, отличных от String (те, для которых isTextual() возвращает false) null будет возвращен. Для значений String значение null никогда не возвращается (но пустые строки могут быть)

Итак, возьмем пример,

JsonNode getJsonData(){
    ObjectMapper mapper = new ObjectMapper();
    ObjectNode node = mapper.createObjectNode(); 
    node.put("anyParameter",null);
    return node;
}
JsonNode node = getJsonData();
json.get("anyParameter").asText() // this will give output as "null"
json.get("").textValue() // this will give output as null

Ответ 5

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

ObjectMapper mapper = new ObjectMapper();
JsonNode treeNode = mapper.readTree(parser);
return treeNode.toString();

Это даст вам строку, содержащую значение "данных".

Ответ 6

Наконец, выяснилось, что решение было прочитано на странице руководства.

Просто, чтобы дать другим указатель здесь:

  • Переключитесь на использование MappingJSONFactory при создании парсера:

        HttpResponse response = client.execute(request);
        JsonFactory jfactory = new MappingJsonFactory();
        JsonParser parser=jfactory.createJsonParser(response.getEntity().getContent());
    
  • Тогда вы можете просто сделать

        parser.readValueAsTree().toString();
    

или проанализируйте его, как хотите.

Ответ 7

Я предполагаю, что вы просто хотите прочитать поддерево ввода с помощью Streaming API, но в конце вам нужно, чтобы целое поддерево было как одна вещь для хранения в БД (или переменной).

Так что вы, вероятно, захотите использовать, это JsonParser.readValueAs(MyType.class) - это вызовет ObjectMapper (и для его работы парсер должен быть создан с помощью JsonFactory, доступ к которому из ObjectMapper), или вам нужно позвонить JsonFactory.setCodec(mapper)).

Если содержимое произвольно, вы можете прочитать его как Map или JsonNode:

Map<String,Object> map = parser.readValueAs(Map.class);
// or
JsonNode root = parser.readValueAsTree();

как только JsonParser указывает на START_ELEMENT объекта JSON, для которого вы хотите привязать данные.

Ответ 8

Если использовать String data в createParser(data), я использую этот метод для сбора содержимого строки с потоковой передачей api:

if ("data".equals(fieldname))
     String strData = getValueAsString(jp);

и

    private static String getValueAsString(JsonParser jp)
        throws com.fasterxml.jackson.core.JsonParseException, IOException {
    JsonToken token = jp.getCurrentToken();
    int counter = 0;

    long startIndex = jp.getCurrentLocation().getCharOffset();
    long endIndex = 0;

    if (token == JsonToken.START_OBJECT) {
        // JsonLocation location = jp.getCurrentLocation();
        // startIndex = location.getCharOffset();
        // System.out.println(",location=" + new Gson().toJson(location) +
        // ", start=" + startIndex);

        counter++;
        while (counter > 0) {
            token = jp.nextToken();
            if (token == JsonToken.START_OBJECT)
                counter++;
            if (token == JsonToken.END_OBJECT) {
                counter--;
                endIndex = jp.getCurrentLocation().getCharOffset();
            }
        }

        return data.substring((int) startIndex - 1, (int) endIndex);

    } else if (token == JsonToken.START_ARRAY) {
        counter++;
        while (counter > 0) {
            token = jp.nextToken();
            if (token == JsonToken.START_ARRAY)
                counter++;
            if (token == JsonToken.END_ARRAY) {
                counter--;
                endIndex = jp.getCurrentLocation().getCharOffset();
            }
        }
        return data.substring((int) startIndex - 1, (int) endIndex);

    } else {
        return jp.getText();
    }
}

он работает, когда источником данных является String. для ни одного источника строки, такого как файл, используя JsonLocation.getByteOffset() вместо JsonLocation.getCharOffset()

Ответ 9

Скажем, у вас есть класс Java POJO под названием User (Взято из этого)

public class User {
public enum Gender { MALE, FEMALE };

public class Name {
    private String _first, _last;

    public String getFirst() { return _first; }
    public String getLast() { return _last; }

    public void setFirst(String s) { _first = s; }
    public void setLast(String s) { _last = s; }
}

private Gender _gender;
private Name _name;
private boolean _isVerified;
private byte[] _userImage;

public Name getName() { return _name; }
public boolean isVerified() { return _isVerified; }
public Gender getGender() { return _gender; }
public byte[] getUserImage() { return _userImage; }

public void setName(Name n) { _name = n; }
public void setVerified(boolean b) { _isVerified = b; }
public void setGender(Gender g) { _gender = g; }
public void setUserImage(byte[] b) { _userImage = b; }

}

Итак, теперь у вас есть строка JSON, которая поступает из любого места где-то в виде веб-сокета или где-то в другом месте. В качестве примера предположим, что это строка, которую вы получаете

String json = "{\n" +
            "  \"name\" : { \"first\" : \"Joe\", \"last\" : \"Sixpack\" },\n" +
            "  \"gender\" : \"MALE\",\n" +
            "  \"verified\" : false,\n" +
            "  \"userImage\" : \"Rm9vYmFyIQ==\"\n" +
            "}";

Теперь вы можете преобразовать эту строку JSON в объект POJO, просто используя этот фрагмент кода.

ObjectMapper mapper = new ObjectMapper();
User user = mapper .readValue(json, User.class);