具有内部数组转换的JSON到String

时间:2012-01-04 20:18:18

标签: json gson stringify

我有一个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无法转换数组属性,因为它不是数组。

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

非常感谢。

2 个答案:

答案 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);
  }
}

答案 1 :(得分:0)

您需要在调用JSON.stringify

之前编写此代码
if(window.Prototype) {
    delete Object.prototype.toJSON;
    delete Array.prototype.toJSON;
    delete Hash.prototype.toJSON;
    delete String.prototype.toJSON;
}