/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */
package com.taobao.weex.wson;

import com.taobao.weex.utils.WXLogUtils;

/**
 * Created by furture on 2018/5/17.
 */

public class WsonUtils {
    /**
     * total entry, with wson support, always parse json
     * */
    public static final Object parseWson(byte[] data){
        if(data == null){
            return  null;
        }
        try{
            return  Wson.parse(data);
        }catch (Exception e){
            WXLogUtils.e("weex wson parse error ", e);
            return  null;
        }
    }

    public static final byte[] toWson(Object data){
        if(data == null){
            return  null;
        }
        try{
            return  Wson.toWson(data);
        }catch (Exception e){
            WXLogUtils.e("weex wson to wson error ", e);
            return  null;
        }
    }
}
