77import com .clickhouse .data .ClickHouseDataType ;
88import com .clickhouse .data .ClickHouseVersion ;
99import com .clickhouse .data .Tuple ;
10+ import com .fasterxml .jackson .core .type .TypeReference ;
11+ import com .fasterxml .jackson .databind .DeserializationFeature ;
12+ import com .fasterxml .jackson .databind .ObjectMapper ;
1013import org .slf4j .Logger ;
1114import org .slf4j .LoggerFactory ;
1215import org .testng .annotations .BeforeClass ;
1316import org .testng .annotations .DataProvider ;
1417import org .testng .annotations .Test ;
1518
19+ import java .io .IOException ;
1620import java .math .BigDecimal ;
1721import java .math .BigInteger ;
1822import java .net .Inet4Address ;
@@ -1961,8 +1965,10 @@ public void testGeoMultiPolygon() throws Exception {
19611965 }
19621966 }
19631967
1968+ private static final HashMap <String , Object > EMPTY_JSON = new HashMap <>();
1969+
19641970 @ Test (groups = { "integration" }, dataProvider = "testJSONReadDP" )
1965- public void testJSONRead (String json ) throws Exception {
1971+ public void testJSONRead (String json , Object expected ) throws Exception {
19661972 if (ClickHouseVersion .of (getServerVersion ()).check ("(,24.8]" )) {
19671973 return ; // JSON was introduced in 24.10
19681974 }
@@ -1979,29 +1985,77 @@ public void testJSONRead(String json) throws Exception {
19791985
19801986 assertTrue (rs .next ());
19811987 Object jsonObj = rs .getObject (1 );
1988+ if (expected == null ) {
1989+ expected = jsonToClientMap (json );
1990+ }
1991+ assertEquals (jsonObj , expected );
19821992 assertTrue (rs .next ());
19831993 Object emptyJsonObj = rs .getObject (1 );
1994+ assertEquals (emptyJsonObj , EMPTY_JSON );
19841995 assertFalse (rs .next ());
19851996 }
19861997 }
19871998 }
19881999
2000+ private final ObjectMapper objectMapper = new ObjectMapper ()
2001+ .enable (DeserializationFeature .USE_LONG_FOR_INTS );
2002+
2003+ private HashMap <String , Object > jsonToClientMap (String json ) {
2004+ try {
2005+ return objectMapper .readValue (json , new TypeReference <HashMap <String , Object >>() {});
2006+ } catch (IOException e ) {
2007+ throw new RuntimeException ("Failed to read json to Map<String, Object>" , e );
2008+ }
2009+ }
2010+
19892011 @ DataProvider (name = "testJSONReadDP" )
19902012 public Object [][] testJSONReadDP () {
2013+ Map <String , Object > map1 = new HashMap <>();
2014+ map1 .put ("nested.key" , "value" );
2015+ Map <String , Object > map2 = new HashMap <>();
2016+ map2 .put ("nested.numbers" ,new ArrayList <Long >() {{ add (1L ); add (2L ); add (3L ); }});
2017+ Map <String , Object > map3 = new HashMap <>();
2018+ map3 .put ("nested.strings" , new ArrayList <>() {{ add ("one" ); add ("two" ); add ("three" ); }});
2019+ Map <String , Object > map4 = new HashMap <>();
2020+ map4 .put ("array" , new ArrayList <HashMap <String ,Object >>() {{
2021+ add (new HashMap <>() {{
2022+ put ("nested.key" , "value" );
2023+ }});
2024+ add (new HashMap <>() {{
2025+ put ("nested.numbers" , new ArrayList <Long >() {{
2026+ add (1L );
2027+ add (2L );
2028+ add (3L );
2029+ }});
2030+ }});
2031+ }});
2032+ Map <String , Object > map5 = new HashMap <>();
2033+ map5 .put ("array" , new ArrayList <HashMap <String ,Object >>() {{
2034+ add (new HashMap <>() {{
2035+ put ("nested.strings" , new ArrayList <>() {{ add ("one" ); add ("two" ); add ("three" ); }});
2036+
2037+ }});
2038+ }});
2039+ Map <String , Object > map6 = new HashMap <>();
2040+ map6 .put ("level1.level2.level3" , "value" );
2041+
2042+ Map <String , Object > map7 = new HashMap <>();
2043+ map7 .put ("level1.level2.level3.level4" , "value" );
2044+
19912045 return new Object [][] {
1992- {"{\" key\" : \" value\" }" }, // Simple object
1993- {"{\" numbers\" :[1, 2, 3]}" },
1994- {"{\" strings\" :[\" one\" , \" two\" , \" three\" ]}" },
1995- {"{\" nested\" :{\" key\" : \" value\" }}" }, // nested objects
1996- {"{\" nested\" :{\" numbers\" :[1, 2, 3]}}" }, // nested objects
1997- {"{\" nested\" :{\" strings\" :[\" one\" , \" two\" , \" three\" ]}}" }, // nested objects
1998- {"{\" array\" :[{\" key\" : \" value\" },{\" key\" : \" value\" }]}" }, // array of objects
1999- {"{\" array\" :[{\" numbers\" :[1, 2, 3]},{\" strings\" :[\" one\" , \" two\" , \" three\" ]}]}" }, // array of objects
2000- {"{\" array\" :[{\" nested\" :{\" key\" : \" value\" }},{\" nested\" :{\" numbers\" :[1, 2, 3]}}]}" }, // array of objects
2001- {"{\" array\" :[{\" nested\" :{\" strings\" :[\" one\" , \" two\" , \" three\" ]}}]}" }, // array of objects
2002- {"{\" array\" :[{\" nested\" :[{\" key\" : \" value\" }]}]}" }, // simple array of objects
2003- {"{\" level1\" : {\" level2\" : {\" level3\" : \" value\" }}}" }, // deep nested objects
2004- {"{\" level1\" : {\" level2\" : {\" level3\" : {\" level4\" : \" value\" }}}}" }, // deep nested objects
2046+ {"{\" key\" : \" value\" }" , null }, // Simple object
2047+ {"{\" numbers\" :[1, 2, 3]}" , null },
2048+ {"{\" strings\" :[\" one\" , \" two\" , \" three\" ]}" , null },
2049+ {"{\" nested\" :{\" key\" : \" value\" }}" , map1 }, // nested objects
2050+ {"{\" nested\" :{\" numbers\" :[1, 2, 3]}}" , map2 }, // nested objects
2051+ {"{\" nested\" :{\" strings\" :[\" one\" , \" two\" , \" three\" ]}}" , map3 }, // nested objects
2052+ {"{\" array\" :[{\" key\" : \" value\" },{\" key\" : \" value\" }]}" , null }, // array of objects
2053+ {"{\" array\" :[{\" numbers\" :[1, 2, 3]},{\" strings\" :[\" one\" , \" two\" , \" three\" ]}]}" , null }, // array of objects
2054+ {"{\" array\" :[{\" nested\" :{\" key\" : \" value\" }},{\" nested\" :{\" numbers\" :[1, 2, 3]}}]}" , map4 }, // array of objects
2055+ {"{\" array\" :[{\" nested\" :{\" strings\" :[\" one\" , \" two\" , \" three\" ]}}]}" , map5 }, // array of objects
2056+ {"{\" array\" :[{\" nested\" :[{\" key\" : \" value\" }]}]}" , null }, // simple array of objects
2057+ {"{\" level1\" : {\" level2\" : {\" level3\" : \" value\" }}}" , map6 }, // deep nested objects
2058+ {"{\" level1\" : {\" level2\" : {\" level3\" : {\" level4\" : \" value\" }}}}" , map7 }, // deep nested objects
20052059
20062060 };
20072061 }
0 commit comments