#/usr/bin/env python
'''
Created on 07-Jan-2013

@author: Raghav Kashyap(raghavkashyap@paxterrasolutions.com)

    TestON is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 2 of the License, or
    (at your option) any later version.

    TestON is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.


    You should have received a copy of the GNU General Public License
    along with TestON.  If not, see <http://www.gnu.org/licenses/>.


'''

import json
class JsonParser:
    '''
    Module that parses the response Json to Dictionary and Vice versa.
    '''
    def __init__(self) :
        self.default = ''

    def response_parse(self,json_response):
        '''
         This will parse the json formatted string and return content as Dictionary
        '''
        response_dict = {}
        try :
            response_dict = json.loads(json_response)
        except Exception:
            main.log.error("Json Parser is unable to parse the string")
        return response_dict

    '''

    def dict_json(self,response_dict):

        # This will parse the Python Dictionary and return content as Json string.

        json_response = {}
        try :
            json_response = json.dumps(response_dict)
        except Exception:
            main.log.error("Json Parser is unable to parse the string")
        return json_response
    '''
