【问题标题】:How to extract JSON data in customized format?如何以自定义格式提取 JSON 数据?
【发布时间】:2019-07-12 06:06:54
【问题描述】:

我有 Json 数据,例如 {"no":["1","2","3"],"date":["23/05/1992","02/01/1991","01/05/1992"]} 我想在java中拆分为正确的格式。

【问题讨论】:

  • 你到底想做什么?如果您有任何尝试失败的代码,您可以包含它
  • 你甚至可以使用 JSONObject

标签: java json date date-parsing


【解决方案1】:

两种主要方式:

1) 定义一个类来映射它:

public class Foo{

   private List<String> no;
   private List<LocalDate> date;
   // setters or factory method
}

并使用 Json API,例如 Jackson:

ObjectMapper mapper = new ObjectMapper();
Foo foo = mapper.readValue(myStringRepresentingJson, Foo.class)

您可能需要使用和设置JsonDateSerializer 实例来指定日期格式。

2) 定义自定义 JSON 反序列化器。

它允许以编程方式更精细地控制将 json 属性映射到 Java 对象的方式。
对于 Jackson,扩展课程 StdDeserializer 是可能的。

【讨论】:

  • 如果我使用这个,我得到 org.codehaus.jackson.map.JsonMappingException: Can not deserialize an instance of java.util.ArrayList out of VALUE_STRING token exception
  • 这意味着对于 no 属性,您不传递 JSON 数组而是传递字符串作为输入。尝试对其进行硬编码以进行测试:String value = "{\"no\":[\"1\",\"2\",\"3\"],\"date\":[\"23/05/1992\",\"02/01/1991\",\"01/05/1992\"]}";Foo foo = mapper.readValue(value, Foo.class);
  • 是的,它可以工作,但是 json 值是由 html 表单动态创建的。如何对其进行编码?
  • 硬编码只是为了测试目的,以确保错误原因。要解决您的要求,请从源头处理问题:发送一个包含正确结构的 json 对象:数组而不是引号之间的数组,它不是数组而是字符串。
  • 你能给我举个例子吗?
【解决方案2】:

试试下面的代码,

public class Req {
    private List<String> no;
    private List<String> date;

    public List<String> getNo() {
        return no;
    }

    public void setNo(List<String> no) {
        this.no = no;
    }

    public List<String> getDate() {
        return date;
    }

    public void setDate(List<String> date) {
        this.date = date;
    }
}

用法

直接使用控制器方法

@PostMapping("/test")
public ResponseEntity<?> test(@RequestBody Req req) {
    System.out.println(req.no);
}

使用 Gson 创建对象

Gson gson = new GsonBuilder().create();
Req req = gson.fromJson(yourjson, Req.class);

将字符串日期转换为本地日期

String date = "02/01/1991";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/MM/yyyy");
LocalDate d = LocalDate.parse(date, formatter);

【讨论】:

  • 1) JSON 不一定从当前代码定义的控制器中公开。这不是实际的要求。 JSON 可以来自本地文件、数据库、外部服务等... 2) 将日期映射到字符串并不是最好的做法。
  • 您不能直接将这种字符串映射到 LocalDate 对象。它会抛出数据绑定异常。
【解决方案3】:

您可以通过 Gson 库映射您的对象。

YourObj obj = new Gson().fromJson(jsonString, YourObj.class);

准备一个带有 no 和 name 属性的 POJO 类。

List<String> no;
List<String> date;

Gson 是一个开源 Java 库,用于将 Java 对象序列化和反序列化为 JSON。

【讨论】:

  • 我正在使用此代码,但它引发了类似 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 12 path $.no
猜你喜欢
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
相关资源
最近更新 更多