首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中映射到JSON

在Java中映射到JSON
EN

Stack Overflow用户
提问于 2012-06-07 12:55:15
回答 2查看 2.3K关注 0票数 1

我有一张像这样的地图:

代码语言:javascript
复制
{ 
  facility-1={
    facility-kind1={param1=XPath-1, param2=XPath-2}, 
    facility-kind2={param1=XPath-1, param2=XPath-2}, 
    facility-kind3={param1=XPath-1, param2=XPath-2}
  },
  facility-2={
    facility-kind1={param1=XPath-1, param2=XPath-2}, 
    facility-kind2={param1=XPath-1, param2=XPath-2}, 
    facility-kind3={param1=XPath-1, param2=XPath-2}
  }
}

我想把它转换成JSON格式,如下所示

代码语言:javascript
复制
[

    {"title": "Item 1"},
    {"title": "Folder 2",
        "children": [
            {"title": "Sub-item 2.1"},
            {"title": "Sub-item 2.2"}
        ]
    },
    {"title": "Folder 3",
        "children": [
            {"title": "Sub-item 3.1"},
            {"title": "Sub-item 3.2"}
        ]
    },
    {"title": "Item 5"}
]

我尝试使用GSON,但得到的输出并不是我想要的:

代码语言:javascript
复制
{
  "facility-1": {
     "facility-kind1":
      {"param1":"XPath-1","param2":"XPath-2"},
     "facility-kind2":
      {"param1":"XPath-1","param2":"XPath-2"},
     "facility-kind3":
      {"param1":"XPath-1","param2":"XPath-2"}
  },
  "facility-2": { 
     "facility-kind1":
      {"param1":"XPath-1","param2":"XPath-2"},
     "facility-kind2":
      {"param1":"XPath-1","param2":"XPath-2","param3":"XPath-3"},
     "facility-kind3":
      {"param1":"XPath-1","param2":"XPath-2"}
  }
}

怎样才能得到我想要的json格式??

EN

回答 2

Stack Overflow用户

发布于 2012-06-07 14:55:40

您需要将JSON转换为您提供的新格式。

要转换的数据:

代码语言:javascript
复制
static String json = 
    "{\n" + 
    "  facility-1={\n" + 
    "    facility-kind1={param1=XPath-1, param2=XPath-2},\n" +  
    "    facility-kind2={param1=XPath-1, param2=XPath-2},\n" + 
    "    facility-kind3={param1=XPath-1, param2=XPath-2}\n" + 
    "  },\n" + 
    "  facility-2={\n" + 
    "    facility-kind1={param1=XPath-1, param2=XPath-2},\n" +  
    "    facility-kind2={param1=XPath-1, param2=XPath-2},\n" +  
    "    facility-kind3={param1=XPath-1, param2=XPath-2}\n" + 
    "  }\n" + 
    "}\n";

使用GSON

创建一些您想要处理数据的类,它们可能如下所示:

代码语言:javascript
复制
static class Facility {
    List<Kind> children = new LinkedList<Kind>();
}

static class Kind {
    String title;
    Map<String, String> params;

    public Kind(String title, Map<String, String> params) {
        this.title = title;
        this.params = params;
    }
}

下一步也是看看源代码,并创建它的代表。我将使用:

代码语言:javascript
复制
Map<String, Map<String, Map<String, String>>>

因为输入数据的布局与之类似。现在使用Gson转换它非常简单:

代码语言:javascript
复制
public static void main(String... args) throws Exception {

    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    Type type = new TypeToken<
            Map<String, Map<String, Map<String, String>>>>() {}.getType();

    Map<String, Map<String, Map<String, String>>> source = 
        gson.fromJson(json, type);

    Map<String, Facility> dest = new HashMap<String, Facility>();

    for (String facilityName : source.keySet()) {
        Map<String, Map<String, String>> facility = source.get(facilityName);

        Facility f = new Facility();

        for (String kindName : facility.keySet())
            f.children.add(new Kind(kindName, facility.get(kindName)));

        dest.put(facilityName, f);
    }

    System.out.println(gson.toJson(dest));
}

使用JSONObject/JSONArray

代码语言:javascript
复制
public static void main(String... args) throws Exception {

    JSONObject source = new JSONObject(json);
    JSONArray destination = new JSONArray();

    for (Iterator<?> keys = source.keys(); keys.hasNext(); ) {

        String facilityName = (String) keys.next();
        JSONObject kinds = source.getJSONObject(facilityName);

        JSONArray children = new JSONArray();
        for (Iterator<?> kit = kinds.keys(); kit.hasNext(); ) {

            String kind = (String) kit.next();
            JSONObject params = kinds.getJSONObject(kind);

            JSONObject kindObject = new JSONObject();
            kindObject.put("title", kind);

            for (Iterator<?> pit = params.keys(); pit.hasNext(); ) {
                String param = (String) pit.next();
                kindObject.put(param, params.get(param));
            }
            children.put(kindObject);
        }

        JSONObject facility = new JSONObject();
        facility.put("title", facilityName);
        facility.put("children", children);
        destination.put(facility);
    }
    System.out.println(destination.toString(2));
}
票数 1
EN

Stack Overflow用户

发布于 2012-06-07 12:58:25

你想要的是漂亮的打印效果。

代码语言:javascript
复制
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(yourMap);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10925874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档