Test.java

package org.drip.sample.json;

import java.io.*;
import java.util.*;

import org.drip.json.parser.*;
import org.drip.json.simple.*;
import org.drip.service.env.EnvManager;

/*
 * -*- mode: java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 */

/*!
 * Copyright (C) 2019 Lakshmi Krishnamurthy
 * Copyright (C) 2018 Lakshmi Krishnamurthy
 * Copyright (C) 2017 Lakshmi Krishnamurthy
 * Copyright (C) 2016 Lakshmi Krishnamurthy
 * Copyright (C) 2015 Lakshmi Krishnamurthy
 * 
 *  This file is part of DROP, an open-source library targeting risk, transaction costs, exposure, margin
 *  	calculations, valuation adjustment, and portfolio construction within and across fixed income,
 *  	credit, commodity, equity, FX, and structured products.
 *  
 *  	https://lakshmidrip.github.io/DROP/
 *  
 *  DROP is composed of three modules:
 *  
 *  - DROP Analytics Core - https://lakshmidrip.github.io/DROP-Analytics-Core/
 *  - DROP Portfolio Core - https://lakshmidrip.github.io/DROP-Portfolio-Core/
 *  - DROP Numerical Core - https://lakshmidrip.github.io/DROP-Numerical-Core/
 * 
 * 	DROP Analytics Core implements libraries for the following:
 * 	- Fixed Income Analytics
 * 	- Asset Backed Analytics
 * 	- XVA Analytics
 * 	- Exposure and Margin Analytics
 * 
 * 	DROP Portfolio Core implements libraries for the following:
 * 	- Asset Allocation Analytics
 * 	- Transaction Cost Analytics
 * 
 * 	DROP Numerical Core implements libraries for the following:
 * 	- Statistical Learning
 * 	- Numerical Optimizer
 * 	- Spline Builder
 * 	- Algorithm Support
 * 
 * 	Documentation for DROP is Spread Over:
 * 
 * 	- Main                     => https://lakshmidrip.github.io/DROP/
 * 	- Wiki                     => https://github.com/lakshmiDRIP/DROP/wiki
 * 	- GitHub                   => https://github.com/lakshmiDRIP/DROP
 * 	- Repo Layout Taxonomy     => https://github.com/lakshmiDRIP/DROP/blob/master/Taxonomy.md
 * 	- Javadoc                  => https://lakshmidrip.github.io/DROP/Javadoc/index.html
 * 	- Technical Specifications => https://github.com/lakshmiDRIP/DROP/tree/master/Docs/Internal
 * 	- Release Versions         => https://lakshmidrip.github.io/DROP/version.html
 * 	- Community Credits        => https://lakshmidrip.github.io/DROP/credits.html
 * 	- Issues Catalog           => https://github.com/lakshmiDRIP/DROP/issues
 * 	- JUnit                    => https://lakshmidrip.github.io/DROP/junit/index.html
 * 	- Jacoco                   => https://lakshmidrip.github.io/DROP/jacoco/index.html
 * 
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *   	you may not use this file except in compliance with the License.
 *   
 *  You may obtain a copy of the License at
 *  	http://www.apache.org/licenses/LICENSE-2.0
 *  
 *  Unless required by applicable law or agreed to in writing, software
 *  	distributed under the License is distributed on an "AS IS" BASIS,
 *  	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  
 *  See the License for the specific language governing permissions and
 *  	limitations under the License.
 */

/**
 * <i>Test</i> is an Adaptation of the Test Class from the RFC4627 compliant JSON Simple
 * (https://code.google.com/p/json-simple/).
 *  
 * <br><br>
 *  <ul>
 *		<li><b>Module </b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/NumericalCore.md">Numerical Core Module</a></li>
 *		<li><b>Library</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/AlgorithmSupportLibrary.md">Algorithm Support Library</a></li>
 *		<li><b>Project</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/sample/README.md">Sample</a></li>
 *		<li><b>Package</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/sample/json/README.md">JSON Serialization and De-serialization</a></li>
 *  </ul>
 * <br><br>
 *
 * @author Fang Yidong
 * @author Lakshmi Krishnamurthy
 */

public class Test {

    @SuppressWarnings ("rawtypes") public static final void testDecode() throws Exception{
            System.out.println("=======decode=======");
            
            String s="[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]";
            Object obj=JSONValue.parse(s);
            JSONArray array=(JSONArray)obj;
            System.out.println("======the 2nd element of array======");
            System.out.println(array.get(1));
            System.out.println();
            System.out.println ("{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}".equalsIgnoreCase(array.get(1).toString()));
            
            JSONObject obj2=(JSONObject)array.get(1);
            System.out.println("======field \"1\"==========");
            System.out.println(obj2.get("1"));      
            System.out.println ("{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}".equalsIgnoreCase(obj2.get("1").toString()));
            
            s="{}";
            obj=JSONValue.parse(s);
            System.out.println ("{}".equalsIgnoreCase(obj.toString()));
            
            s="[5,]";
            obj=JSONValue.parse(s);
            System.out.println ("[5]".equalsIgnoreCase(obj.toString()));
            
            s="[5,,2]";
            obj=JSONValue.parse(s);
            System.out.println ("[5,2]".equalsIgnoreCase(obj.toString()));
            
            s="[\"hello\\bworld\\\"abc\\tdef\\\\ghi\\rjkl\\n123\\u4e2d\"]";
            obj=JSONValue.parse(s);
            System.out.println ("hello\bworld\"abc\tdef\\ghi\rjkl\n123中".equalsIgnoreCase(((List)obj).get(0).toString()));
            
            JSONParser parser = new JSONParser();
            s="{\"name\":";
            try{
                    obj = parser.parse(s);
            }
            catch(ParseException pe){
            	System.out.println (ParseException.ERROR_UNEXPECTED_TOKEN == pe.getErrorType());
            	System.out.println (8 == pe.getPosition());
            }
            
            s="{\"name\":}";
            try{
                    obj = parser.parse(s);
            }
            catch(ParseException pe){
                    System.out.println (ParseException.ERROR_UNEXPECTED_TOKEN == pe.getErrorType());
                    System.out.println (8 == pe.getPosition());
            }
            
            
            s="{\"name";
            try{
                    obj = parser.parse(s);
            }
            catch(ParseException pe){
                    System.out.println (ParseException.ERROR_UNEXPECTED_TOKEN == pe.getErrorType());
                    System.out.println (6 == pe.getPosition());
            }
            
            
            s = "[[null, 123.45, \"a\\\tb c\"}, true]";
            try{
                    parser.parse(s);
            }
            catch(ParseException pe){
                    System.out.println (24 == pe.getPosition());
                    System.out.println("Error at character position: " + pe.getPosition());
                    switch(pe.getErrorType()){
                    case ParseException.ERROR_UNEXPECTED_TOKEN:
                            System.out.println("Unexpected token: " + pe.getUnexpectedObject());
                            break;
                    case ParseException.ERROR_UNEXPECTED_CHAR:
                            System.out.println("Unexpected character: " + pe.getUnexpectedObject());
                            break;
                    case ParseException.ERROR_UNEXPECTED_EXCEPTION:
                            ((Exception)pe.getUnexpectedObject()).printStackTrace();
                            break;
                    }
            }
            
            s = "{\"first\": 123, \"second\": [4, 5, 6], \"third\": 789}";
            ContainerFactory containerFactory = new ContainerFactory(){
                    public List creatArrayContainer() {
                            return new LinkedList();
                    }

                    public Map createObjectContainer() {
                            return new LinkedHashMap();
                    }
                    
            };
            
            try{
                    Map json = (Map)parser.parse(s, containerFactory);
                    Iterator iter = json.entrySet().iterator();
                    System.out.println("==iterate result==");
                    while(iter.hasNext()){
                            Map.Entry entry = (Map.Entry)iter.next();
                            System.out.println(entry.getKey() + "=>" + entry.getValue());
                    }
                    
                    System.out.println("==toJSONString()==");                       
                    System.out.println(JSONValue.toJSONString(json));
                    System.out.println ("{\"first\":123,\"second\":[4,5,6],\"third\":789}".equalsIgnoreCase(JSONValue.toJSONString(json)));
            }
            catch(ParseException pe){
                    pe.printStackTrace();
            }
            
            s = "{\"first\": 123, \"second\": [{\"s1\":{\"s11\":\"v11\"}}, 4, 5, 6], \"third\": 789}";
            ContentHandler myHandler = new ContentHandler() {

                    public boolean endArray() throws ParseException {
                            System.out.println("endArray()");
                            return true;
                    }

                    public void endJSON() throws ParseException {
                            System.out.println("endJSON()");
                    }

                    public boolean endObject() throws ParseException {
                            System.out.println("endObject()");
                            return true;
                    }

                    public boolean endObjectEntry() throws ParseException {
                            System.out.println("endObjectEntry()");
                            return true;
                    }

                    public boolean primitive(Object value) throws ParseException {
                            System.out.println("primitive(): " + value);
                            return true;
                    }

                    public boolean startArray() throws ParseException {
                            System.out.println("startArray()");
                            return true;
                    }

                    public void startJSON() throws ParseException {
                            System.out.println("startJSON()");
                    }

                    public boolean startObject() throws ParseException {
                            System.out.println("startObject()");
                            return true;
                    }

                    public boolean startObjectEntry(String key) throws ParseException {
                            System.out.println("startObjectEntry(), key:" + key);
                            return true;
                    }
                    
            };
            try{
                    parser.parse(s, myHandler);
            }
            catch(ParseException pe){
                    pe.printStackTrace();
            }
    
    class KeyFinder implements ContentHandler{
        private Object value;
        private boolean found = false;
        private boolean end = false;
        private String key;
        private String matchKey;
        
        public void setMatchKey(String matchKey){
            this.matchKey = matchKey;
        }
        
        public Object getValue(){
            return value;
        }
        
        public boolean isEnd(){
            return end;
        }
        
        public void setFound(boolean found){
            this.found = found;
        }
        
        public boolean isFound(){
            return found;
        }
        
        public void startJSON() throws ParseException, IOException {
            found = false;
            end = false;
        }

        public void endJSON() throws ParseException, IOException {
            end = true;
        }

        public boolean primitive(Object value) throws ParseException, IOException {
            if(key != null){
                if(key.equals(matchKey)){
                    found = true;
                    this.value = value;
                    key = null;
                    return false;
                }
            }
            return true;
        }

        public boolean startArray() throws ParseException, IOException {
            return true;
        }

        
        public boolean startObject() throws ParseException, IOException {
            return true;
        }

        public boolean startObjectEntry(String key) throws ParseException, IOException {
            this.key = key;
            return true;
        }
        
        public boolean endArray() throws ParseException, IOException {
            return false;
        }

        public boolean endObject() throws ParseException, IOException {
            return true;
        }

        public boolean endObjectEntry() throws ParseException, IOException {
            return true;
        }
    };
    
    s = "{\"first\": 123, \"second\": [{\"k1\":{\"id\":\"id1\"}}, 4, 5, 6, {\"id\": 123}], \"third\": 789, \"id\": null}";
    parser.reset();
    KeyFinder keyFinder = new KeyFinder();
    keyFinder.setMatchKey("id");
    int i = 0;
    try{
        while(!keyFinder.isEnd()){
            parser.parse(s, keyFinder, true);
            if(keyFinder.isFound()){
                i++;
                keyFinder.setFound(false);
                System.out.println("found id:");
                System.out.println(keyFinder.getValue());
                if(i == 1)
                    System.out.println ("id1".equalsIgnoreCase((String)keyFinder.getValue()));
                if(i == 2){
                	System.out.println (keyFinder.getValue() instanceof Number);
                    System.out.println ("123".equalsIgnoreCase(String.valueOf(keyFinder.getValue())));
                }
                if(i == 3)
                	System.out.println (null == keyFinder.getValue());
            }
        }
    }
    catch(ParseException pe){
        pe.printStackTrace();
    }
    }
    
    @SuppressWarnings ({"rawtypes", "unchecked"}) public static final void testEncode() throws Exception{
            System.out.println("=======encode=======");
            
            JSONArray array1=new JSONArray();
            array1.add("abc\u0010a/");
            array1.add(Integer.toString(123));
            array1.add(Double.toString(222.123));
            array1.add(Boolean.toString(true));
            System.out.println("======array1==========");
            System.out.println(array1);
            System.out.println();
            System.out.println ("[\"abc\\u0010a\\/\",123,222.123,true]".equalsIgnoreCase(array1.toString()));
            
            JSONObject obj1=new JSONObject();
            obj1.put("name","fang");
            obj1.put("age",Integer.toString(27));
            obj1.put("is_developer", Boolean.toString(true));
            obj1.put("weight", Double.toString(60.21));
            obj1.put("array1",array1);
            System.out.println("======obj1 with array1===========");
            System.out.println(obj1);
            System.out.println();
            System.out.println ("{\"array1\":[\"abc\\u0010a\\/\",123,222.123,true],\"weight\":60.21,\"age\":27,\"name\":\"fang\",\"is_developer\":true}".equalsIgnoreCase(obj1.toString()));
            
            obj1.remove("array1");
            array1.add(obj1);
            System.out.println("======array1 with obj1========");
            System.out.println(array1);
            System.out.println();
            System.out.println ("[\"abc\\u0010a\\/\",123,222.123,true,{\"weight\":60.21,\"age\":27,\"name\":\"fang\",\"is_developer\":true}]".equalsIgnoreCase(array1.toString()));
    
            List list = new ArrayList();
            list.add("abc\u0010a/");
            list.add(Integer.toString (123));
            list.add(Double.toString (222.123));
            list.add(Boolean.toString (true));
            list.add(null);
            System.out.println("======list==========");
            System.out.println(JSONArray.toJSONString(list));
            System.out.println();
            System.out.println ("[\"abc\\u0010a\\/\",123,222.123,true,null]".equalsIgnoreCase(JSONArray.toJSONString(list)));
            
            Map map = new HashMap();
            map.put("name","fang");
            map.put("age", Integer.toString (27));
            map.put("is_developer", Boolean.toString (true));
            map.put("weight", Double.toString (60.21));
            map.put("array1",list);
            System.out.println("======map with list===========");
            System.out.println(map);
            System.out.println();
            System.out.println ("{\"array1\":[\"abc\\u0010a\\/\",123,222.123,true,null],\"weight\":60.21,\"age\":27,\"name\":\"fang\",\"is_developer\":true}".equalsIgnoreCase(JSONObject.toJSONString(map)));               
            
    Map m1 = new LinkedHashMap();
    Map m2 = new HashMap();
    List  l1 = new LinkedList();

    m1.put("k11","v11");
    m1.put("k12","v12");
    m1.put("k13", "v13");
    m2.put("k21","v21");
    m2.put("k22","v22");
    m2.put("k23","v23");
    l1.add(m1);
    l1.add(m2);
    String jsonString = JSONValue.toJSONString(l1);
    System.out.println(jsonString);
    System.out.println ("[{\"k11\":\"v11\",\"k12\":\"v12\",\"k13\":\"v13\"},{\"k22\":\"v22\",\"k21\":\"v21\",\"k23\":\"v23\"}]".equalsIgnoreCase(jsonString));

    StringWriter out = new StringWriter();
    JSONValue.writeJSONString(l1, out);
    jsonString = out.toString();
    System.out.println(jsonString);
    System.out.println ("[{\"k11\":\"v11\",\"k12\":\"v12\",\"k13\":\"v13\"},{\"k22\":\"v22\",\"k21\":\"v21\",\"k23\":\"v23\"}]".equalsIgnoreCase(jsonString));
    
    List l2 = new LinkedList();
    Map m3 = new LinkedHashMap();
    m3.put("k31", "v3");
    m3.put("k32", Double.toString (123.45));
    m3.put("k33", Boolean.toString (false));
    m3.put("k34", null);
    l2.add("vvv");
    l2.add("1.23456789123456789");
    l2.add(Boolean.toString (true));
    l2.add(null);
    m3.put("k35", l2);
    m1.put("k14", m3);
    out = new StringWriter();
    JSONValue.writeJSONString(l1, out);
    jsonString = out.toString();
    System.out.println(jsonString);
    System.out.println ("[{\"k11\":\"v11\",\"k12\":\"v12\",\"k13\":\"v13\",\"k14\":{\"k31\":\"v3\",\"k32\":123.45,\"k33\":false,\"k34\":null,\"k35\":[\"vvv\",\"1.23456789123456789\",true,null]}},{\"k22\":\"v22\",\"k21\":\"v21\",\"k23\":\"v23\"}]".equalsIgnoreCase(jsonString));
}

    public static final void main (
    	final String[] astrArgs)
    	throws Exception
    {
    	EnvManager.InitEnv ("");

    	testEncode();

    	testDecode();

    	EnvManager.TerminateEnv();
    }
}