6

我正在尝试使用相应的键/值对创建一个 JSON 字符串。在下面的代码中,我尝试迭代列表,AttributeValue然后尝试使用al.getValue map.

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()所以 JSON 字符串在迭代地图后应该看起来像这样-

{
 "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 字符串,我是寻找。谁能帮我解决这个问题,最干净的方法是什么?

谢谢

4

5 回答 5

7

不确定您正在执行什么确切任务,但是有许多 Java 的 JSON 库可以为您执行此操作,例如java 中的 jsongoogle-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"
}}
于 2013-06-13T23:22:18.670 回答
4

你可以这样做:

import org.json.JSONObject;

JSONObject rootJo = new JSONObject();

for (AttributeValue<?> al : list) {
    JSONObject mapJo = new JSONObject(al.getValue());
    rootJo.put("v", mapJo);
}

换句话说:

  • 创建一个名为rootJo(根 JSON 对象)的新(空)JSONObject
  • 遍历您的地图列表
  • 对于列表中的每个元素,将地图转换为 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 是什么……在任何地方都找不到)

于 2013-06-13T23:42:07.360 回答
2

使用杰克逊。它比 Gson 轻巧且速度更快。它也不知道被 OEM 捆绑,这可能会弄乱您的类路径。

于 2013-06-13T23:22:09.593 回答
1

使用谷歌 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
        }
于 2014-04-22T09:59:31.180 回答
0

我假设您想发回 JSON 作为对调用请求的响应。您可以使用 Spring 框架,它使用 Jackson 转换器自动将 Map 对象转换为 JSON。您只需要使用注释 @ResponseBody 作为返回类型。您可以阅读更多有关 Spring 3 文档的信息。

于 2013-06-13T23:21:31.427 回答