带有Volley的嵌套JSON请求 - >逃脱的角色

时间:2014-07-04 20:46:04

标签: java encoding escaping gson android-volley

我想用一个REST API发布一个post请求。 因此,我创建了一个JSONObject并将一个类生成的JSON字符串放入其中。

JSONObject jsonObject = new JSONObject();
String json = gson.toJson(MyClazz);
try {
    jsonObject.put(PARAM,  json);
}
catch (JSONException e1) {
    e1.printStackTrace();
}

问题是正确计算的JSON字符串会被转义,并且无法在后端识别。

所以toJson()给出了类似的内容:

{
    "device_identifier":"324234234",
    "name":"NameMe",
    "list":[
        {"prop":"A","prop2":-10},
        {"prop":"B","prop2":-12}
    ]
}

jsonObject的输出类似于

{
    "PARAM":{
        \"device_identifier\":\"324234234\",
        \"name\":\"NameMe\",
        \"list\":[
            {\"prop\":\"A\",\"prop2\":-10},
            {\"prop\":\"B\","\prop2\":-12}
        ]
    }
}

我需要用于JSON结构的PARAM,所以我不能直接将它提供给REST-API。我有什么想法可以避免额外的逃避?

1 个答案:

答案 0 :(得分:0)

您可以使用简单的包装器对象包装MyClazz对象,然后将该包装对象传递给Gson的toJson方法。

根据您的示例JSON给出此类,

public class MyClazz {
    public String device_identifier;
    public String name;
    public List<Prop> list;
    public class Prop {
        public String prop;
        public Integer prop2;
    }
}

这是一个可能的包装器实现。请注意使用com.google.gson.annotations.SerializedName告诉Gson在JSON表示中使用PARAM键。

public class MyClazzWrapper {
    public MyClazzWrapper(MyClazz myClazz) {
        this.myClazz = myClazz;
    }
    @SerializedName("PARAM")
    private MyClazz myClazz;
}

这是一个使用它的例子:

Gson gson = new GsonBuilder().setPrettyPrinting().create();

MyClazz myClazz = gson.fromJson("{\"device_identifier\":\"324234234\",\"name\":\"NameMe\",\"list\":[{\"prop\":\"A\",\"prop2\":-10},{\"prop\":\"B\",\"prop2\":-12}]}", MyClazz.class);
MyClazzWrapper wrapped = new MyClazzWrapper(myClazz);

System.out.println(gson.toJson(wrapped));

以上将打印:

{
    "PARAM": {
        "device_identifier": "324234234",
        "name": "NameMe",
        "list": [
            {
                "prop": "A",
                "prop2": -10
            },
            {
                "prop": "B",
                "prop2": -12
            }
        ]
    }
}