Извлечение массива байтов из JSON

У меня есть JSON следующего формата:

[{"fingerprint":"[79,0,0,0,18,0,0,0,18,0,0,0,19,0,0,0,23,0,0,0,40,0,0,0,42,0,0,0,63,0,0,0,68,0,0,0,71,0,....]"}]

Я пытался извлечь из него массив байтов, используя следующее:

JSONFingerprint fingerprintData = gson.fromJson(obj, JSONFingerprint.class);

Где JSONFingerprint:

public class JSONFingerprint {

    byte[] fingerprint;

    public byte[] getfingerprintData() {
        return fingerprint;
    }

}

Я получаю эту ошибку:

Exception in thread "Thread-0" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176)
    at com.google.gson.Gson.fromJson(Gson.java:795)
    at com.google.gson.Gson.fromJson(Gson.java:859)
    at com.google.gson.Gson.fromJson(Gson.java:832)

У кого-нибудь есть идеи??


person TomSelleck    schedule 26.03.2013    source источник
comment
Должен ли ваш массив быть внутри строки?   -  person atw13    schedule 26.03.2013
comment
У вас есть массив, содержащий объект, содержащий массив. Сначала вам нужно проиндексировать массив, а затем извлечь отпечаток элемента из полученного объекта. Элемент отпечатка пальца будет массивом, который предположительно является массивом байтов, который вы хотите.   -  person Hot Licks    schedule 26.03.2013
comment
Но @atw13 имеет точку зрения, что элемент отпечатка пальца, по-видимому, представляет собой строку, содержащую массив, поэтому вам нужно извлечь строку, а затем запустить ее через интерпретатор JSON для извлечения массива.   -  person Hot Licks    schedule 26.03.2013


Ответы (1)


Похоже, ваши JSON и POJO не совпадают. Для этого может быть 2 возможных решения.

Решение 1:-

Если вы не можете изменить формат JSON (т.е.), ваш JSON будет таким,

[{"fingerprint":"[79,0,0,0,18,0,0,0,18,0,0,0,19,0,0,0,23,0,0,0,40,0,0,0,42,0,0,0,63,0,0,0,68,0,0,0,71,0,....]"}]

Затем вам нужно изменить свой класс JSONFingerprint на это: -

public class JSONFingerprint {

    String fingerprint;

    public String getfingerprintData() {
        return fingerprint;
    }
}

и вам нужно разобрать свой JSON следующим образом: -

JSONFingerprint[] dummy = new JSONFingerprint[0]; 
JSONFingerprint[] fingerPrint = gson.fromJson(json, dummy.getClass());
System.out.println(fingerPrint[0].getfingerprintData());

Решение 2:-

Если ваш POJO не может измениться (т.е.) ваш POJO будет таким,

public class JSONFingerprint {

    byte[] fingerprint;

    public byte[] getfingerprintData() {
        return fingerprint;
    }
}

Затем вам придется изменить формат JSON на что-то вроде этого: -

{"fingerprint":[1,2,3,4,5,6,7,8,9,10]}

который вы можете обычно разбирать, как вы уже сделали: -

JSONFingerprint fingerprintData = gson.fromJson(obj, JSONFingerprint.class);

Надеюсь, это поможет вам!

person RainMaker    schedule 26.03.2013