3

我有一个 larga 数据 JSON,我想将它传递给后端以在那里解析成 java 对象。

为了做到这一点,我使用 JSON.stringify 函数,但在 JSON 中有一个数组属性,JSON.stringify 用引号 (") 括起来,所以当 Gson 找到它时(我在后端使用的方式将字符串解码为对象),它会引发错误,因为这不是 JSON 字符串表示中的数组,而是 JSON 字符串表示中的字符串属性。

这是使用 JSON.stringify 生成的字符串示例:

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

数组属性不能被 Gson 转换,因为它不是一个数组。

有人可以帮我解决这个问题吗?

非常感谢。

4

2 回答 2

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);
  }
}
于 2012-01-05T07:32:48.397 回答
0

您需要在调用 JSON.stringify 之前编写此代码

if(window.Prototype) {
    delete Object.prototype.toJSON;
    delete Array.prototype.toJSON;
    delete Hash.prototype.toJSON;
    delete String.prototype.toJSON;
}
于 2015-05-20T21:20:51.343 回答