JsonPath
        
            Java JsonPath implementation
     
 json-path -
 
 
 Java JsonPath implementation - Google Project Hosting
           
               
           
            
        
            
             
              
      
                 
                
                
            
            
I have been looking at JSONPath and though it seems pretty well done, I wonder if anyone has worked with it and can comment on its usability, or can recommend alternatives?  What would be really slick is if there was a plugin for JQuery that did something like this.  I have been searching the plugins and coming up empty handed.  Anyway, before I spend time getting to know JSONPath (which has some aspects I am not keen on), or before I reinvent wheels, I thought I'd see if anyone had an angle on this...
To give you an idea what I mean, imagine this Javascript object:
var Characters=[
        {
            id: "CuriousGeorge",
            species:"Monkey",
            mood: "curious",
            appendage: [
                { 
                    type: "hand",
                    side: "left",
                    holding: [ 
                        { id: "Banana" } 
                    ]
                },
                { 
                    type: "hand",
                    side: "right",
                    holding: []
                }, 
                { 
                    type: "foot",
                    side: "left",
                    holding: []
                },
                { 
                    type: "foot",
                    side: "right",
                    holding: [ 
                        { id: "YellowHat" },
                        { id: "Keys" }
                    ]
                }
            ]
        },
        {
            id: "ManInYellowHat",
            species: "Human",
            mood: "angry",
            //...ok, you get it...
        }
    ]
Wouldn't it be great to get to of some of the deeper objects by something like Jquery selectors?
var banana=SomeUtility("Characters holding #Banana").get(0);
var leftHands=SomeUtility("Characters appendage[type=hand][side=left]").get();
(This may qualify for worlds corniest code example, but hey, my kids just watched this.  And I can't use real example because of NDA...)
...And, to make it more interesting, if I were to create such a thing, would anyone use it?
        Source: (StackOverflow)
                  
                 
            
                 
                
                
            
            
I am currently writing some unit tests for a Spring MVC project.
As the returned media type is JSON, I try to use jsonPath to check if the correct values are returned.
The trouble I have is to verify if a list of strings contains the correct (and only the correct) values.
My Plan was:
- Check that the list has the correct length
- For each element that's supposed to be returned, check whether it's in the list
sadly, none of these things seem to work.
Here's the relevant part of my code:
Collection<AuthorityRole> correctRoles = magicDataSource.getRoles();
ResultActions actions = this.mockMvc.perform(get("/accounts/current/roles").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()) // works
.andExpect(jsonPath("$.data.roles").isArray()) // works
.andExpect(jsonPath("$.data.roles.length").value(correctRoles.size())); // doesn't work
for (AuthorityRole role : correctRoles) // doesn't work
  actions.andExpect(jsonPath("$.data.roles[?(@=='%s')]", role.toString()).exists());
Only the first two "expectations" (isOk & isArray) are working. The other ones (for length and content) I can twist and turn however I want, they're not giving me any useful result.
Any suggestions?
        Source: (StackOverflow)
                  
                 
            
                 
                
                
            
            
I have a JSON response from the Facebook API that looks like this:
{
  "data": [
     {
       "name": "Barack Obama", 
       "category": "Politician", 
       "id": "6815841748"
     }, 
     {
       "name": "Barack Obama's Dead Fly", 
       "category": "Public figure", 
       "id": "92943557739"
     }]
 }
I want to apply JSONPath to it to only return results with a category of "Politician". From what I've read, it appears that I need to do:
$.data[?(@.category=='Politician')]
but according to the testing tool I found, this doesn't work. I found another question which suggests that I should use "eq" instead of "==", but that doesn't work either. What am I getting wrong here?
        Source: (StackOverflow)
                  
                 
            
                 
                
                
            
            
I'm doing some tests with MockMvc, and I want to validate the structure of a JSON response. Specifically, I want to make sure that the key to an attribute exists, and that the value is of a certain type or null.
{
   "keyToNull": null,  # This may be null, or a String
   "keyToString": "some value"
}
The following works for me, but I'm wondering if there's a way to combine each group of two expectations into a single line, as I have a lot of attributes to check:
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.hamcrest.Matchers.*;
.andExpect(jsonPath("$").value(hasKey("keyToNull")))
.andExpect(jsonPath("$.keyToNull").value(
                  anyOf(any(String.class), nullValue(String.class))))
.andExpect(jsonPath("$").value(hasKey("keyToString")))
.andExpect(jsonPath("$.keyToString").value(
                  anyOf(any(String.class), nullValue(String.class))))
The hasKey() is necessary because the other assertion by itself passes since nonexistent keys in MockMvc's implementation map to null:
.andExpect(jsonPath("$.notAKey").value(
                  anyOf(any(String.class), nullValue(String.class)))) // ok
jsonPath().exists() also doesn't work, because internally it compares the value against null.
I've considered making a separate method like this:
private static <T> void assertNullableAttr(ResultActions res, String jsonPath, Class<T> type) throws Exception {
    int split = jsonPath.lastIndexOf('.');
    String prefix = jsonPath.substring(0, split), key = jsonPath.substring(split+1);
    res.andExpect(jsonPath(prefix).value(hasKey(key)))
        .andExpect(jsonPath(jsonPath).value(anyOf(any(type), nullValue(type))));
    }
But then it forces me to split my code in an unnatural way:
ResultActions res = mockMvc.perform(get("/api"))
    // these attributes must not be null
    .andExpect(jsonPath("$.someInfo").value(hasSize(2)))
        .andExpect(jsonPath("$.someInfo[0].info1").value(any(String.class)))
        .andExpect(jsonPath("$.someInfo[0].info2").value(any(String.class)))
    .andExpect(jsonPath("$.addlInfo").value(hasSize(2)))
        .andExpect(jsonPath("$.addlInfo[0].info1").value(any(String.class)))
        .andExpect(jsonPath("$.addlInfo[0].info2").value(any(String.class)));
// these attributes may be null
assertNullableAttr(res, "$.someInfo[0].info3", String.class);
assertNullableAttr(res, "$.someInfo[0].info4", String.class);
assertNullableAttr(res, "$.addlInfo[0].info3", String.class);
assertNullableAttr(res, "$.addlInfo[0].info4", String.class);
Is there any clever Hamcrest Matcher I could apply to a single json path per attribute?
        Source: (StackOverflow)
                  
                 
            
                 
                
                
            
            
I am using Spring's "spring-test-mvc" library to test web controllers. I have a very simple controller that returns a JSON array. Then in my test I have:
@Test
public void shouldGetAllUsersAsJson() throws Exception {
    mockMvc.perform(get("/v1/users").accept(MediaType.APPLICATION_JSON))
            .andExpect(content().mimeType(MediaType.APPLICATION_JSON))
            .andExpect(jsonPath("fName").exists());
}
The above test returns:
java.lang.AssertionError: No value for JSON path: fName
To quickly check what I actually get I ran the below test:
@Test
public void shouldPrintResults() throws Exception {
    mockMvc.perform(get("/v1/users").accept(MediaType.APPLICATION_JSON))
            .andDo(print());
}
And it returns the correct JSON array in the body of MockHttpServletResponse
I'm not sure why jsonPath is not able to see fName in the JSON array.
        Source: (StackOverflow)
                  
                 
            
                 
                
                
            
            
Here's my json:
{
   'test': [
        { "id": "1", "description": "Test 1" },
        { "id": "2", "description": "Test 2" }
    ]
}
I'm trying to get the value for id where description is "Test 1".
I found the following example on the JsonPath page:
$..book[?(@.price<10)]
When trying to parse the following jsonxpath expression:
parse('$..test[?(@.description="Test 1")].id')
I get the following error:
jsonpath_rw.lexer.JsonPathLexerError: Error on line 1, col 7: Unexpected character: ?
What am I doing wrong? Alternatively, is there a better way to do this?
        Source: (StackOverflow)
                  
                 
            
                 
                
                
            
            
I am using nodejs with jsonpath.
I have this json structure:
{
  things:{
    books: [
      {name: "book1"},
      {name: "book2"},
      {name: "book3"},
      {name: "book4"},
    ],
    movies: [
      {name: "movie1"},
      {name: "movie2"},
      {name: "movie3"},
      {name: "movie4"},
    ]
  }
}
I would like to know the jsonpath expression that returns an array with the key names of the things object. That would be:
["books","movies"]
For now, I am doing this:
Object.keys(jsonpath.eval(jsonStructure,"$.things").pop());
But I don't find it elegant... I should not need to get a copy the whole structure when I only need the key names.
        Source: (StackOverflow)
                  
                 
            
                 
                
                
            
            
I'm trying to perform a JSON assertion using ATLANTBH jmeter JSON PATH Assertion.
 However I cant seem to write a correct expression to get the following fields from the JSON feed posted below:
- 123456789
- 1009
- SOME RANDOM MESSAGE - {"api": {"status":"Success","callsremaining":36,"version":"x.x.x.x"}
,"result":{"errors":{"123456789":{"code":1009,"error":"SOME RANDOM MESSAGE"}}}
}
 
Has anyone here got any experience using this JMeter plugin?
I know I could use regex and Beanshell to validate but I'd rather use these JSON Path Assertion.
Any help you could provide would be most appreciated.
        Source: (StackOverflow)
                  
                 
            
                 
                
                
            
            
I want my controller action to handle jsonp requests from jquery $.getJSON. In my controller action i have the following respond_to block:
respond_to do |format|
  format.html { render json: {:items_by_tag => @tagged_item_list}}
  if params[:callback]
        format.js { render :json => {:items_by_tag => @tagged_item_list}.to_json, :callback => params[:callback] }
  else
        format.json { render json: {:items_by_tag => @tagged_item_list}}
  end
end
But I'm getting SyntaxError:invalid label when i call the url from $.getJSON. My url is of the form http://myservice.com?param1=a¶m2=b&callback=?.
What is the problem with my code which is causing jsonp to fail?
        Source: (StackOverflow)
                  
                 
            
                 
                
                
            
            
I have data like so:
{"key": {"name":"hi", "size":10}}
"key" is a dynamic value. It isn't fixed. I can access name and size using this JSON Path:
*.name
*.size
How can I get the value of "key" itself with JSON Path? * gives me the entire row of data, and both $ and @ give me "no element found" in my parser.
I'm trying to do this in Pentaho with a JSON Input step.
        Source: (StackOverflow)
                  
                 
            
                 
                
                
            
            
I have a json like the following:
{
  "d": {
    "results": [
      {
        "__metadata": {
        },
        "prop1": "value1",
        "prop2": "value2",
        "__some": "value"
      },
      {
        "__metadata": {
        },
        "prop3": "value1",
        "prop4": "value2",
        "__some": "value"
      },
    ]
  }
}
I just want to transform this JSON into a different JSON. I want to strip out the "_metadata" and "_some" nodes from  the JSON. I'm using JSON.NET.
        Source: (StackOverflow)
                  
                 
            
                 
                
                
            
            
I want to parse this with JSONPath:
[
  [50.4154134372953,-1.28486558931069,"CLASS B",9,205,0,"UK",431500382,3,4],
  [50.3058858494047,-0.976070494820637,"CLASS B",9,239,0,"UK",2750350,21,2]
]
Can you help with that please?
        Source: (StackOverflow)
                  
                 
            
                 
                 
            
                 
                
                
            
            
Is it possible to count the number of members using JsonPath?
Using spring mvc test I'm testing a controller that generates 
{"foo": "oof", "bar": "rab"}
with
standaloneSetup(new FooController(fooService)).build()
            .perform(get("/something").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk())
            .andExpect(jsonPath("$.foo").value("oof"))
            .andExpect(jsonPath("$.bar").value("rab"));
I'd like to make sure that no other members are present in the generated json. Hopefully by counting them using jsonPath. Is it possible? Alternate solutions are welcome too.
        Source: (StackOverflow)
                  
                 
            
                 
                
                
            
            
How to get field from a:b:c:d:f:1.0 property via JsonPath? 
"a:b:c:d:f:1.0" : {
    "field" : "field"}
I tried with a:b:c:d:f:1.0.field but returns invalid path.
        Source: (StackOverflow)