如何使用Map中的键/值创建JSON字符串

时间:2013-06-13 23:15:49

标签: java json map

我正在尝试使用相应的键/值对创建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上进行检查时,我看到valueLinkedHashMap<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 -

之后,JSON String应该看起来像这样
{
 "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字符串,我是寻找。任何人都可以帮助我这样做最干净的方法吗?

由于

5 个答案:

答案 0 :(得分:3)

不确定您正在执行什么确切的任务,但有许多Java的JSON库可以为您执行此操作,例如json in javagoogle-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);
}

换句话说:

  • 创建一个名为 rootJo 的新(空)JSONObject(根JSON对象)
  • 遍历您的地图列表
  • 对于列表中的每个元素,将地图转换为JSONObject(使用库)
  • rootJo 添加新属性(密钥为v
  • v的值设置为从地图
  • 创建的JSONObject

也许我错过了什么,但我会用这个替换你的整个方法:

/**
 *  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文档中阅读更多信息。