【问题标题】:Json to Java MappingJson 到 Java 的映射
【发布时间】:2016-11-16 09:27:24
【问题描述】:

我想将下面的 Json 数据映射到 List<Map<String, String>> 类型的 java 对象。

Json 示例:

{ 
  {
    a:b,
    c:d
  },
  {
    e:f,
    g:h,
    i:j
  },
  { 
   h:k
  }
}

这里a:b代表键值对。所以a:bc:d 将被映射到列表的第一个映射,依此类推。 一种方法是构建 JSON 树并访问每个节点并将该对​​存储到地图中。

有没有更好的方法来做到这一点(更清洁的方法)?

【问题讨论】:

  • 你看过Jackson等JSON库吗?
  • 嗯,json 对象不是List<Map<String, String>>,它更像是Map<String, Object>,其中Object 可以是List<Map<String, Object>>List<Object>(以及那些嵌套的@987654332 @s 也可以是相同的两件事)。至于解析它,我个人会使用 json 库,但它基本上归结为当时的状态机(在输入符号上)
  • 尝试使用真实的数据样本。使用 gson,您可以轻松创建与 JSON 对象匹配的数据类,并轻松(反)序列化它。 JSON 对象的结构是否会有很大差异?
  • 如果你的 json 对象没有变化,序列化和反序列化就可以了。我对么?但就我而言,它会有所不同。

标签: java jackson


【解决方案1】:

以下是使用 Jackson 库读取List<Map<String, String>> 的代码,输入示例数据:

public class JsonTest {
public static void main(String[] args) throws Exception {
    final String json
        = "[\n"
        + "    {\n"
        + "        \"a\":\"b\",\n"
        + "        \"c\":\"d\"\n"
        + "    },\n"
        + "    {\n"
        + "        \"e\":\"f\",\n"
        + "        \"g\":\"h\",\n"
        + "        \"i\":\"j\"\n"
        + "    },\n"
        + "    {\n"
        + "        \"h\":\"k\"\n"
        + "    }\n"
        + "]"; // [{a:b,c:d},{e:f,g:h,i:j},{h:k}]   
    ObjectMapper mapper = new ObjectMapper();
    TypeFactory factory = TypeFactory.defaultInstance();
    List<Map<String, String>> list = mapper.readValue(json,factory
        .constructCollectionType(List.class, factory
                .constructMapType(Map.class, String.class, String.class)));
    System.out.println(list.toString());
}
}

注意:我必须将最外面的大括号从 {} 改成 [],这是正确的 JSON 列表语法。

【讨论】:

  • 另见link peeskillet 解决方案。
  • 这绝对是我想要的。 :)
【解决方案2】:

您可以通过下面的示例代码使用Jackson 来完成此任务

public class JacksonExample {
public static void main(String[] args) {

    ObjectMapper mapper = new ObjectMapper();

    try {

        // Convert JSON string from file to Object
        User user = mapper.readValue(new File("C:\\user.json"), User.class);
        System.out.println(user);

        // Convert JSON string to Object
        String jsonInString = "{\"age\":33,\"messages\":[\"msg 1\",\"msg 2\"],\"name\":\"xyz\"}";
        User user1 = mapper.readValue(jsonInString, User.class);
        System.out.println(user1);

    } catch (JsonGenerationException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

}

【讨论】:

  • 如果你的 json 对象没有变化,序列化和反序列化就可以了。我对么?但就我而言,它会有所不同。
  • 如果您的 json 结构变化不可预测,那么 JSON 树是恕我直言的唯一选择。
  • 我会检查这是否适合我。 stackoverflow.com/questions/13916086/…
  • 感谢您告诉我 :) 我会检查到
【解决方案3】:

首先我对您的 json 进行了一些更改以使其有效

{
"key": 
    [{
        "a": "b",
        "c": "d"
    },
    {
        "e": "f",
        "g": "h",
        "i": "j"
    }, 
    {
        "h": "k"
    }]

}

请找到我尝试过的以下代码:

ObjectMapper mapper = new ObjectMapper();
ObjectNode objectNode1 = mapper.createObjectNode();
Map<String, Object> i = mapper.readValue(new File("J:/temp/sample.json"), Map.class);
System.out.println(i.get("key"));
System.out.println(i.values());

输出:

//对于System.out.println(i.get("key"));

[{a=b, c=d}, {e=f, g=h, i=j}, {h=k}]

//对于System.out.println(i.values());

[[{a=b, c=d}, {e=f, g=h, i=j}, {h=k}]]

如果上述方法对您有帮助,请根据您的需要做出正确的决定,无论是 i.get("key") 还是 i.values()

【讨论】:

    【解决方案4】:

    只需使用gson库对Json进行对象和对Json的对象

    import java.lang.reflect.Type;
    import com.google.gson.Gson;
    import com.google.gson.reflect.TypeToken;
    

    对象到 Json

    Gson gson = new Gson();
    Student obj=new Student();
    String jsonInString = gson.toJson(obj);
    

    Json 到对象

    Student obj = gson.fromJson(jsonInString, Student.class);
    

    【讨论】:

      猜你喜欢
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 2013-04-17
      • 1970-01-01
      相关资源
      最近更新 更多