0

JSON の最も内側のキーを見つけることに興味があります。たとえば、次の JSON があるとします。

{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Product",
"description": "A product from Acme's catalog",
"type": "object",
"properties": {
    "id": {
        "description": "The unique identifier for a product",
        "type": "integer"
    },
    "name": {
        "description": "Name of the product",
        "type": "string"
    },
    "price": {

        "minimum": 0,
    "type": "number",
        "exclusiveMinimum": true
    }
},
"required": ["id", "name", "price"]
}

出力には、最も内側のキーとして、 descriptiontypedescriptiontypeminimumtype、およびexclusiveMinimumが含まれている必要があります。

4

2 に答える 2

0

より簡単な方法:
最初の関数は、すべてのプロパティとそのレベルを検索します

function findAllProperties(obj)
{
   var retVal = [];
   (function findProperty(obj, depth)
   {
       for (var prop in obj)
       {
           if (obj[prop] instanceof Object)
           {
              findProperty(obj[prop], depth + 1); 
           }
           else
           {
              retVal.push({"name" : prop, "depth" : depth}); 
           }
       }
   })(obj, 0);
   return retVal;
} 

2 番目の関数は、最大レベルのプロパティを検索します

function siftInnerMost(items)
{
    var maxDepth = 0, retVal = [];
    for (var i in items)
    {
        if (items[i].depth == maxDepth)
        {
           retVal.push(items[i].name);
        }
        else if (items[i].depth > maxDepth)
        {
           maxDepth = items[i].depth;
           retVal = [items[i].name];
        }
    }
    return retVal;
}  

inner most今、あなたは鍵 を見つけることができます

var inners = findAllProperties(data);
var innerMost = siftInnerMost(inners);  

JSFiddle DEMO

Json-Simple lib を使用したJavaソリューション

public class InnerMostFinder 
{
   private List<Pair> inners = new ArrayList<Pair>();

    private static class Pair
    {
       int level;
       String property;

       public Pair(int level, String property) 
       {
          this.level = level;
         this.property = property;
       }
    }

    private void findAllProperties(final JSONObject obj, final int level)
    {
       for (Object key : obj.keySet())
       {
          Object innerObj = obj.get(key);
          if (innerObj instanceof JSONObject)
          {
             findAllProperties((JSONObject) innerObj, level + 1); 

          }
          else
          {
              inners.add(new Pair(level, (String) key)); 
          }
       }
    }

    public List<String> getInnerMost(final JSONObject obj)
    {
       final List<String> retVal = new ArrayList<String>();
       int maxLevel = 0;
       findAllProperties(obj, maxLevel);
       for (final Pair pair : inners)
       {
          if (pair.level == maxLevel)
          {
             retVal.add(pair.property);
          }
          else if (pair.level > maxLevel)
          {
             maxLevel = pair.level;
             retVal.clear();
             retVal.add(pair.property);
          }
       }
       return retVal;
    }
}  

利用方法

   JSONObject obj = (JSONObject) new JSONParser()
      .parse(new FileReader(new File("D:/test.json")));
   System.out.println(new InnerMostFinder().getInnerMost(obj));
于 2013-09-06T08:21:57.367 に答える