【问题标题】:How to make a JSON String using the key/value from the Map如何使用 Map 中的键/值创建 JSON 字符串
【发布时间】:2013-06-10 12:41:39
【问题描述】:

我正在尝试使用相应的键/值对创建 JSON 字符串。在下面的代码中,我尝试迭代AttributeValue 的列表,然后尝试使用al.getValue map 制作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&lt;K,V&gt;,当我打印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 字符串,我是寻找。任何人都可以帮我解决这个问题,比如最干净的方法是什么?

谢谢

【问题讨论】:

  • 为什么不使用像 GSON 这样的序列化库来为您完成这一切?
  • 您知道可以从 Map 创建 JSONObject,对吧?见this
  • 我可以使用各种 JSON 库,但它们不会像我在实际 JSONString 中看到的那样给我 lvv。意思是,我需要在我的实际 JSONString 中附加这些 lv and v
  • 我不明白为什么你不能使用图书馆。你让这种方式变得复杂。

标签: java json map


【解决方案1】:

不确定您正在执行什么具体任务,但有许多 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"
}}

【讨论】:

  • 我可以使用各种 JSON 库,但它们不会像我在实际的 JSONString 中那样给我 lv 和 v。意思是,我需要在我的实际 JSONString 中附加这些 lv 和 v
  • @user21973:我不明白。如果您创建了正确的 json 对象,那么它肯定会为您生成正确的输出...
  • 我和你在同一页上@keelar。 OP 使这种 WAY 过于复杂。这应该非常简单,并且应该涉及手动构造 JSON 字符串所涉及的任何麻烦。
【解决方案2】:

你可以这样做:

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 是什么......在任何地方都找不到)

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我可以使用各种 JSON 库,但它们不会像我在实际的 JSONString 中那样给我 lv 和 v。意思是,我需要在我的实际 JSONString 中附加这些 lv 和 v
    • @user21973 - 是的,他们会的。您只需要正确使用库;-)
    【解决方案4】:

    使用谷歌 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
            }
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 我可以使用各种 JSON 库,但这些库不会像我在实际 JSONString 中看到的那样给我 lv 和 v。意思是,我需要在我的实际 JSONString 中附加这些 lv 和 v
      • 如果您将地图创建为“v”并将“v”列表创建为 lv,它将为您提供您正在查看的 json。所以你会有一个 json 的主地图 - Map jsonMap = new HasMap(); jsonMap.put("lv", v 列表);返回 jsonMap 会给你杰克逊的 json...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 2013-03-18
      • 2018-08-06
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多