我正在尝试使用相应的键/值对创建JSON字符串。在下面的代码中,我试图迭代AttributeValue
列表,然后我尝试使用al.getValue map
makie JSON字符串。
private <T> String createJsonWithEscCharacters(List<AttributeValue<T>> list) {
StringBuilder keyValue = new StringBuilder();
if (list != null) {
for (AttributeValue<?> al: list) {
keyValue.append("\"").append("v").append("\"").append(":").append(" {");
for (Map.Entry<String, String> entry : ((Map<String, String>) al.getValue()).entrySet()) {
keyValue.append("\"").append(entry.getKey()).append("\"");
keyValue.append(":").append(" \"").append(entry.getValue()).append("\"").append(",");
System.out.println(keyValue);
}
}
}
return null;
}
当我在al
上进行检查时,我看到value
为LinkedHashMap<K,V>
,当我打印al.getValue()
时,它给了我这个 -
{predictedCatRev=0;101;1,1;201;2, predictedOvrallRev=77;2,0;1,16;3, sitePrftblty=77;2,0;1671679, topByrGms=12345.67, usrCurncy=1, vbsTopByrGmb=167167.67}
这意味着,我可以迭代al.getValue()
地图并使用那些key/value pair
来制作JSON字符串。
现在我试图通过迭代al.getValue()
地图来制作一个JSON字符串。因此,在迭代al.getValue()
map -
{
"lv": [
{
"v": {
"predictedCatRev": "0;101;1,1;201;2",
"predictedOvrallRev": "77;2,0;1,16;3",
"sitePrftblty": "77;2,0;1671679",
"topByrGms": "12345.67",
"usrCurncy": "1",
"vbsTopByrGmb": "167167.67"
}
}
],
}
我想知道最干净的方法是什么?在我的上面的代码中,我不能完全能够制作上面的JSON字符串,但无论我上面有什么代码,它都能够以我需要的方式制作一小部分JSON字符串,但是方式中没有完整的JSON字符串,我是寻找。任何人都可以帮助我这样做最干净的方法吗?
由于
答案 0 :(得分:3)
不确定您正在执行什么确切的任务,但有许多Java的JSON库可以为您执行此操作,例如json in java和google-gson。例如,在java中的json中,一旦填充了JSONObject中的所有值,然后将其转换为JSON字符串就相当容易了:
JSONObject.toString(); // compact JSON string
JSONObject.toString(int indent); // easier readable format with indention.
例如,在您的情况下,您可以创建如下所示的JSONObject并调用其toString()函数。这样可以节省您格式化字符串以适应JSON格式的时间:
JSONObject jsonObject = new JSONObject();
Map<String, String> strStrMap = new HashMap<String, String>();
strStrMap.put("hello", "world");
strStrMap.put("here is", "an example");
jsonObject.put("myMap", strStrMap);
System.out.println(jsonObject.toString(2));
这是它的输出:
{"myMap": {
"hello": "world",
"here is": "an example"
}}
答案 1 :(得分:3)
你可以这样做:
import org.json.JSONObject;
JSONObject rootJo = new JSONObject();
for (AttributeValue<?> al : list) {
JSONObject mapJo = new JSONObject(al.getValue());
rootJo.put("v", mapJo);
}
换句话说:
v
)v
的值设置为从地图也许我错过了什么,但我会用这个替换你的整个方法:
/**
* Creates a JSON object from a list of attributes that
* have maps as their values.
*/
private JSONObject toJson(List<AttributeValue<?>> attList) {
if (attList == null) {
return null;
}
JSONObject jo = new JSONObject();
JSONArray ja = new JSONArray();
for (AttributeValue<?> att : attList) {
JSONObject mapJo = new JSONObject(att.getValue());
ja.put("v", mapJo);
}
jo.put("lv", ja);
return jo;
}
你也应该把它变成类型安全的,但我会把更精细的细节留给你......
(加上我不确定什么是AttributeValue ......无法在任何地方找到它)
答案 2 :(得分:2)
使用杰克逊。它比Gson重量轻,速度快。它也不为OEM所捆绑,这可能会弄乱您的类路径。
答案 3 :(得分:1)
使用google gson。
var getRowData =
[{
"dayOfWeek": "Sun",
"date": "11-Mar-2012",
"los": "1",
"specialEvent": "",
"lrv": "0"
},
{
"dayOfWeek": "Mon",
"date": "",
"los": "2",
"specialEvent": "",
"lrv": "0.16"
}];
JsonElement root = new JsonParser().parse(request.getParameter("getRowData"));
JsonArray jsonArray = root.getAsJsonArray();
JsonObject jsonObject1 = jsonArray.get(0).getAsJsonObject();
String dayOfWeek = jsonObject1.get("dayOfWeek").toString();
//使用杰克逊时
JsonFactory f = new JsonFactory();
ObjectMapper mapper = new ObjectMapper();
JsonParser jp = f.createJsonParser(getRowData);
// advance stream to START_ARRAY first:
jp.nextToken();
// and then each time, advance to opening START_OBJECT
while (jp.nextToken() == JsonToken.START_OBJECT) {
Map<String,Object> userData = mapper.readValue(jp, Map.class);
userData.get("dayOfWeek");
// process
// after binding, stream points to closing END_OBJECT
}
答案 4 :(得分:0)
我假设你想要发送一个JSON作为对调用请求的响应。你可以使用Spring框架,它使用Jackson转换器自动将Map对象转换为JSON。您只需要使用注释@ResponseBody作为返回类型。您可以在Spring 3文档中阅读更多信息。