Синтаксический анализ JSON для объекта Java, когда во вложенном файле JSON встречается то же имя поля - PullRequest
0 голосов
/ 28 марта 2019

Ниже мой JSON:

{
  "time":{
    "date":{
      "year":2017,
      "month":3,
      "day":12
     },
    "time":{
      "hour":10,
      "minute":42,
      "second":42,
      "nano":810000000
     }
   },
"name":"Jon",
"message":{
"product":"orange"
"price":2000
}
}

Поле 'time' имеет вложенное поле 'time'. Как я могу разобрать это, используя Джексона для Java-объекта. Может кто-нибудь сказать, пожалуйста, правильный метод?

Ответы [ 3 ]

2 голосов
/ 28 марта 2019

Вы можете создавать классы, подобные этим:

class JavaObject {
    private TimeObject time;
    private String name;
    //other fields
    //getters and setters
}

class TimeObject {
    private Date date;
    private Time time;
    //getters and setters
}

class Date {
    private int year;
    private int month;
    private int day;
    //getters and setters
}

class Time {
    private int hour;
    private int minute;
    private int second;
    private long nano;
    //getters and setters
}

После этого вы можете использовать Jackson для десериализации строки json в JavaObject объект, например:

ObjectMapper objectMapper = new ObjectMapper();
JavaObject javaObject = objectMapper.readValue("{\n" + 
        "  \"time\":{\n" + 
        "    \"date\":{\n" + 
        "      \"year\":2017,\n" + 
        "      \"month\":3,\n" + 
        "      \"day\":12\n" + 
        "     },\n" + 
        "    \"time\":{\n" + 
        "      \"hour\":10,\n" + 
        "      \"minute\":42,\n" + 
        "      \"second\":42,\n" + 
        "      \"nano\":810000000\n" + 
        "     }\n" + 
        "   },\n" + 
        "\"name\":\"Jon\"}", JavaObject.class);
System.out.println(javaObject);
1 голос
/ 28 марта 2019

Если вам нужен только внутренний time объект, вы можете сделать это быстро:

// your POJO class
// (public fields sould be private with getter & setter, of course)

public class Pojo {
    public int hour;
    public int minute;
    public int second;
    public long nano;

    @Override
    public String toString() {
        return hour + ":" + minute + ":" + second + ":" + nano;
    }
}

А затем:

//your json string
String jsonString = "{\"time\":{\"date\":{\"year\":2017,\"month\":3,\"day\":12},"
                + "\"time\":{\"hour\":10,\"minute\":42,\"second\":42,\"nano\":810000000}},"
                + "\"name\":\"Jon\",\"message\":{\"product\":\"orange\",\"price\":2000}}";

ObjectMapper mapper = new ObjectMapper();
JsonNode jsonRoot = mapper.readTree(jsonString); //parse string to JsonNode
Pojo pojo = mapper.treeToValue(jsonRoot.at("/time/time"), Pojo.class); //create Pojo instance from inner time object
System.out.println(pojo); //see if it worked

Это печатает:

10:42:42:810000000

0 голосов
/ 28 марта 2019

Использование Библиотека Джексона

ObjectMapper jsonMapper= new ObjectMapper();
YourCorrespondingObject object = jsonMapper.readValue("your json as string...", YourCorrespondingObject.class);

проще сначала создать свой объект, заполнить его и преобразовать в строку, чтобы убедиться, что он равен существующей строке, например:

String jsonInString = mapper.writeValueAsString(object);
...