// Copyright 2013 The Closure Library Authors. All Rights Reserved.
//
// 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.


/**
 * @fileoverview Utility to attempt native JSON processing, falling back to
 *     goog.json if not available.
 *
 *     This is intended as a drop-in for current users of goog.json who want
 *     to take advantage of native JSON if present.
 *
 * @author nnaze@google.com (Nathan Naze)
 */

goog.provide('goog.json.hybrid');

goog.require('goog.asserts');
goog.require('goog.json');


/**
 * Attempts to serialize the JSON string natively, falling back to
 * {@code goog.json.serialize} if unsuccessful.
 * @param {!Object} obj JavaScript object to serialize to JSON.
 * @return {string} Resulting JSON string.
 */
goog.json.hybrid.stringify = function(obj) {
  if (goog.global.JSON) {
    try {
      return goog.global.JSON.stringify(obj);
    } catch (e) {
      // Native serialization failed.  Fall through to retry with
      // goog.json.serialize.
    }
  }

  return goog.json.serialize(obj);
};


/**
 * Attempts to parse the JSON string natively, falling back to
 * the supplied {@code fallbackParser} if unsuccessful.
 * @param {string} jsonString JSON string to parse.
 * @param {function(string):Object} fallbackParser Fallback JSON parser used
 *     if native
 * @return {!Object} Resulting JSON object.
 * @private
 */
goog.json.hybrid.parse_ = function(jsonString, fallbackParser) {
  if (goog.global.JSON) {
    try {
      var obj = goog.global.JSON.parse(jsonString);
      goog.asserts.assertObject(obj);
      return obj;
    } catch (e) {
      // Native parse failed.  Fall through to retry with goog.json.unsafeParse.
    }
  }

  var obj = fallbackParser(jsonString);
  goog.asserts.assert(obj);
  return obj;
};


/**
 * Attempts to parse the JSON string natively, falling back to
 * {@code goog.json.parse} if unsuccessful.
 * @param {string} jsonString JSON string to parse.
 * @return {!Object} Resulting JSON object.
 */
goog.json.hybrid.parse = function(jsonString) {
  return goog.json.hybrid.parse_(jsonString, goog.json.parse);
};


/**
 * Attempts to parse the JSON string natively, falling back to
 * {@code goog.json.unsafeParse} if unsuccessful.
 * @param {string} jsonString JSON string to parse.
 * @return {!Object} Resulting JSON object.
 */
goog.json.hybrid.unsafeParse = function(jsonString) {
  return goog.json.hybrid.parse_(jsonString, goog.json.unsafeParse);
};

@@ -1271,16 +1271,87 @@
 ingify =
+ goog.json.USE_NATIVE_JSON ?%0A    goog.global%5B'JSON'%5D%5B'stringify'%5D :%0A   
  functio
@@ -1355,24 +1355,28 @@
 tion(obj) %7B%0A
+    
   if (goog.g
@@ -1389,30 +1389,38 @@
 JSON) %7B%0A    
+  
+  
 try %7B%0A
+    
       return
@@ -1453,24 +1453,28 @@
 y(obj);%0A    
+ 
+   
 %7D catch (e) 
@@ -1467,32 +1467,36 @@
   %7D catch (e) %7B%0A
+    
       // Native 
@@ -1551,16 +1551,20 @@
 h%0A      
+    
 // goog.
@@ -1583,23 +1583,35 @@
 ze.%0A    
+   
+ 
 %7D%0A
+    
   %7D%0A%0A
+    
   return
@@ -1637,16 +1637,20 @@
 e(obj);%0A
+    
 %7D;%0A%0A%0A/**
@@ -2612,24 +2612,91 @@
 brid.parse =
+ goog.json.USE_NATIVE_JSON ?%0A    goog.global%5B'JSON'%5D%5B'parse'%5D :%0A   
  function(js
@@ -2699,32 +2699,36 @@
 n(jsonString) %7B%0A
+    
   return goog.js
@@ -2774,16 +2774,20 @@
 parse);%0A
+    
 %7D;%0A%0A%0A/**
@@ -3030,16 +3030,83 @@
 eParse =
+ goog.json.USE_NATIVE_JSON ?%0A    goog.global%5B'JSON'%5D%5B'parse'%5D :%0A   
  functio
@@ -3121,16 +3121,20 @@
 ring) %7B%0A
+    
   return
@@ -3194,11 +3194,15 @@
 Parse);%0A
+    
 %7D;%0A

Add goog.json.USE_NATIVE_JSON check to goog.json.hybrid. ------------- Created by MOE: http://code.google.com/p/moe-java MOE_MIGRATED_REVID=64715211