2012-01-04 8 views
3

У меня есть большая информация JSON, которую я хочу передать на бэкэнд, который будет разбираться там, чтобы стать в java-объектах.JSON to String с преобразованием внутреннего массива

Для этого я использую функцию JSON.stringify, но внутри JSON есть атрибут массива, который JSON.stringify заключает между кавычками ("), поэтому, когда Gson нахожу его (способ, которым я пользуюсь на бэкэнде, чтобы декодировать строку в объекты), она выдает ошибку, потому что это не массив внутри строкового представления JSON, а строка, входящая в строковое представление JSON.

Это пример строки, сгенерированной с помощью JSON.stringify:.

{"id":0, "array": "[{\"id\":0, \"cod\": \"XXX\"}, {\"id\":0, \"cod\": \"XXX\"}]"} 

атрибут массив не может быть преобразован Gson, потому что не является массивом

Может ли кто-нибудь помочь мне в этом вопросе?

Большое спасибо.

+0

Вы нашли решение этой проблемы? –

ответ

0

Я бы предпочел исправить сгенерированный JSON, но если это невозможно или не предпочтительнее, похоже, вам просто нужно десериализовать часть JSON дважды. Это может быть выполнено с помощью специального десериализатора следующим образом.

import java.lang.reflect.Type; 
import java.util.Arrays; 

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.JsonDeserializationContext; 
import com.google.gson.JsonDeserializer; 
import com.google.gson.JsonElement; 
import com.google.gson.JsonParseException; 

public class GsonFoo 
{ 
    public static void main(String[] args) 
    { 
    // With the generated JSON corrected: 

    // {"id":42, "array": [{"id":1, "cod": "aaa"}, {"id":2, "cod": "bbb"}]} 
    String jsonInput = "{\"id\":42, \"array\": [{\"id\":1, \"cod\": \"aaa\"}, {\"id\":2, \"cod\": \"bbb\"}]}"; 

    Gson gson = new Gson(); 

    Bar bar1 = gson.fromJson(jsonInput, Bar.class); 
    System.out.println(bar1); 
    // Bar: id=42, array=[Thing: id=1, cod=aaa, Thing: id=2, cod=bbb] 

    // ------------------------- 

    // With the funky JSON: 

    // {"id":42, "array": "[{\"id\":1, \"cod\": \"aaa\"}, {\"id\":2, \"cod\": \"bbb\"}]"} 
    String funkyJsonInput = "{\"id\":42, \"array\": \"[{\\\"id\\\":1, \\\"cod\\\": \\\"aaa\\\"}, {\\\"id\\\":2, \\\"cod\\\": \\\"bbb\\\"}]\"}"; 

    GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.registerTypeAdapter(Thing[].class, new FunkyThingArrayDeserializer()); 
    gson = gsonBuilder.create(); 

    Bar bar2 = gson.fromJson(funkyJsonInput, Bar.class); 
    System.out.println(bar2); 
    // Bar: id=42, array=[Thing: id=1, cod=aaa, Thing: id=2, cod=bbb] 
    } 
} 

class FunkyThingArrayDeserializer implements JsonDeserializer<Thing[]> 
{ 
    @Override 
    public Thing[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
     throws JsonParseException 
    { 
    String actualJson = context.deserialize(json, String.class); 
    return new Gson().fromJson(actualJson, Thing[].class); 
    } 
} 

class Bar 
{ 
    int id; 
    Thing[] array; 

    @Override 
    public String toString() 
    { 
    return String.format("Bar: id=%d, array=%s", id, Arrays.toString(array)); 
    } 
} 

class Thing 
{ 
    int id; 
    String cod; 

    @Override 
    public String toString() 
    { 
    return String.format("Thing: id=%d, cod=%s", id, cod); 
    } 
} 
0

Вам нужно написать этот код, прежде чем вызывать JSON.stringify

if(window.Prototype) { 
    delete Object.prototype.toJSON; 
    delete Array.prototype.toJSON; 
    delete Hash.prototype.toJSON; 
    delete String.prototype.toJSON; 
} 

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

  • Нет связанных вопросов^_^