JSON в строку с преобразованием внутреннего массива - PullRequest
3 голосов
/ 05 января 2012

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

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 21 мая 2015

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

if(window.Prototype) {
    delete Object.prototype.toJSON;
    delete Array.prototype.toJSON;
    delete Hash.prototype.toJSON;
    delete String.prototype.toJSON;
}
0 голосов
/ 05 января 2012

Скорее всего, я бы предпочел исправить сгенерированный 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);
  }
}
...