Jump to content

Recommended Posts

I'm trying to parse this JSON data:
 

{
  "id":"fb66aaec-f713-424c-ba04-386d0986fb12",
  "planId":"4c7cbe9c-ba67-4d8b-b731-32d3de0de700",
  "name":"AJ3",
  "redrillOfHoleId":null,
  "design":{
    "angle":0.0,
    "bearing":4.376555,
    "comment":null,
    "decks":[
      {
        "number":1,
        "horizon":25.0,
        "length":5.0,
        "productId":"f3fb75ac-1065-4d9c-bd6a-fdf01c34837b",
        "weight":0.0,
        "isVariable":false,
        "isBackfill":false
      },
      {
        "number":2,
        "horizon":20.0,
        "length":5.0,
        "productId":"5800171c-e16e-48e7-9431-ac9b88f4852f",
        "weight":441.786469,
        "isVariable":false,
        "isBackfill":false
      },
      {
        "number":3,
        "horizon":15.0,
        "length":5.0,
        "productId":"f3fb75ac-1065-4d9c-bd6a-fdf01c34837b",
        "weight":0.0,
        "isVariable":false,
        "isBackfill":false
      },
      {
        "number":4,
        "horizon":10.0,
        "length":5.0,
        "productId":"0fa2dd6d-6b0c-4bfd-998b-e0b50ee64481",
        "weight":353.429169,
        "isVariable":false,
        "isBackfill":false
      },
      {
        "number":5,
        "horizon":5.0,
        "length":5.0,
        "productId":"f3fb75ac-1065-4d9c-bd6a-fdf01c34837b",
        "weight":0.0,
        "isVariable":true,
        "isBackfill":false
      },
      {
        "number":6,
        "horizon":0.0,
        "length":5.0,
        "productId":"5800171c-e16e-48e7-9431-ac9b88f4852f",
        "weight":441.786469,
        "isVariable":false,
        "isBackfill":false
      }
    ],
    "diameter":300.0,
    "length":30.0,
    "x":-194.97681394419092,
    "y":67.241148799992772,
    "z":0.0,
    "whenCreated":"2020-01-28T01:51:43.4065706Z",
    "whenUpdated":"2020-01-28T01:51:43.4065706Z"
  },
  "adjustedDesign":{
    "angle":0.0,
    "bearing":4.376555,
    "comment":null,
    "decks":[
      {
        "number":1,
        "horizon":25.0,
        "length":5.0,
        "productId":"0fa2dd6d-6b0c-4bfd-998b-e0b50ee64481",
        "weight":353.429,
        "isVariable":false,
        "isBackfill":false
      },
      {
        "number":2,
        "horizon":20.0,
        "length":5.0,
        "productId":"f3fb75ac-1065-4d9c-bd6a-fdf01c34837b",
        "weight":0.0,
        "isVariable":false,
        "isBackfill":false
      },
      {
        "number":3,
        "horizon":15.0,
        "length":5.0,
        "productId":"5800171c-e16e-48e7-9431-ac9b88f4852f",
        "weight":441.786,
        "isVariable":false,
        "isBackfill":false
      },
      {
        "number":4,
        "horizon":10.0,
        "length":5.0,
        "productId":"f3fb75ac-1065-4d9c-bd6a-fdf01c34837b",
        "weight":0.0,
        "isVariable":false,
        "isBackfill":false
      },
      {
        "number":5,
        "horizon":5.0,
        "length":5.0,
        "productId":"0fa2dd6d-6b0c-4bfd-998b-e0b50ee64481",
        "weight":353.429,
        "isVariable":false,
        "isBackfill":false
      },
      {
        "number":6,
        "horizon":0.0,
        "length":5.0,
        "productId":"5800171c-e16e-48e7-9431-ac9b88f4852f",
        "weight":441.786,
        "isVariable":false,
        "isBackfill":false
      }
    ],
    "diameter":300.0,
    "length":30.0,
    "x":-194.97681394419092,
    "y":67.241148799992772,
    "z":0.0,
    "whenCreated":"2020-01-28T02:04:07.6143372Z"
  },
  "actual":{
    "angle":null,
    "bearing":null,
    "calculatedDecks":[],
    "comment":null,
    "depthToWater":null,
    "diameter":null,
    "expectedDeckCount":null,
    "length":null,
    "accessories":[],
    "measuredDecks":[],
    "notDrilled":false,
    "userName":null,
    "x":null,
    "y":null,
    "z":null
  },
  "drillAdjustedDesign":null,
  "drillActual":null,
  "holeType":"Hole type 1",
  "materialType":null,
  "isDeleted":false,
  "isNonDesignedHole":false,
  "allowTruncatedDesign":false,
  "disableChangeDesignRules":false,
  "scaleDepthOfBurial":null,
  "strataIntercepts":{},
  "tags":["drilling_designed","loading_designed"],
  "whenCreated":"2020-01-28T01:51:43.4065706Z",
  "whenUpdated":"2020-01-28T01:51:43.4065706Z"
}

But am currently getting this error:
 

Quote

JSONtext.lvlib:JSON text to Variant.vi:4410001<ERR>
State: Parser Error
Near: ':nu'
in '"2020-01-28T02:04:07.6143372Z"},"actual":{"angle":null,"bearing":null,"calculatedDecks":[],"comment":null,"depthToWater":null,"diameter":null,"expectedDeckCount":null,"length":null,"accessories":[],"me'


<b>Complete call chain:</b>
     JSONtext.lvlib:JSON text to Variant.vi:4410001
     JSONtext.lvlib:JSON text to Variant.vi:4410003
     Parse Hole JSON.vi

 

Share this post


Link to post
Share on other sites

The error is coming from where you attempt to convert null (as in "comment":null) to a string.   Intuitively, one would think that a null should be equivalent to an empty string (just as when converted to a number, null becomes NaN and does not throw an error).  Thank you for the report.

Share this post


Link to post
Share on other sites

No problem. Thanks for following it up so quickly. Until a fix is done I could precheck specific fields that may error and set them to empty strings before passing into your conversion vi.

Share this post


Link to post
Share on other sites

@drjdpowell Also if you go through and set the comment fields to empty strings, the next parsing error hit is this:
 

Quote

Error 1 occurred at JSONtext.lvlib:JSON text to Variant.vi:4410003

Possible reason(s):

Cannot Get as integer: null


Complete call chain:
     JSONtext.lvlib:JSON text to Variant.vi:4410003
     JSONtext.lvlib:JSON text to Variant.vi:4410002
     JSON Parsing Error.vi

This is replicated using the same VI shared above by first setting the comment keys to actual strings

Share this post


Link to post
Share on other sites

That one is trickier.   What is null supposed to mean, interpreted as an integer?   Unlike for Floats, there is no Not-an-Integer value, nor is there an obvious "null" value like an empty string.   Should one just use zero as null?   Or should one consider the null to be that same as if the item was not present at all in the JSON, those using your default value in the supplied cluster.  Why is whatever generated this JSON providing null values at all?  Especially in place of strings and integers?

Share this post


Link to post
Share on other sites
13 hours ago, camow7 said:

Until a fix is done I could precheck specific fields that may error and set them to empty strings before passing into your conversion vi.

A possibly better option is to replace your string/integer values with JSON strings, which is LabVIEW strings with <JSON> at the start of the name.  So "<JSON>Comment" rather than "Comment".   JSONtext will happily parse out the value into your cluster as JSON, then when you actually need your value you can convert it to string/integer, with appropriate handling if it is null or throws an error.

This method, by the way, is also how to handle JSON that has variable structure.

  • Like 1

Share this post


Link to post
Share on other sites
2 hours ago, drjdpowell said:

Why is whatever generated this JSON providing null values at all?  Especially in place of strings and integers?

I imagine it is C , C++ or Javascript. NULL is a specific type of invalid pointer in C/C++ languages and "not an object" in Javascript (as opposed to "undefined"). In LabVIEW we don't really have either concepts.

In JSON, it is a valid type so it depends on how you want to translate it back into a LabVIEW type. Historically I have converted in the following manner: string->empty, numeric->0, boolean->false etc. Unless, of course, it is in quotes. In that case it is the string "NULL", in whatever case, as it's implicity typed.

Edited by ShaunR

Share this post


Link to post
Share on other sites

Is there a plan to implement conditional filters in the JSON paths?  For instance the following should return a single book title, but I get a parsing error due to the question mark.

Or is this already implemented in a different manner?

--tested on jsonpath.com--

$.store.book[?(@.category=='reference')].title

 

{
    "store":
    {
        "book":
        [
            { "category": "reference",
              "author": "Nigel Rees",
              "title": "Sayings of the Century",
              "price": 8.95
            },
            { "category": "fiction",
              "author": "Evelyn Waugh",
              "title": "Sword of Honour",
              "price": 12.99
            },
            { "category": "fiction",
              "author": "Herman Melville",
              "title": "Moby Dick",
              "isbn": "0-553-21311-3",
              "price": 8.99
            },
            { "category": "fiction",
              "author": "J. R. R. Tolkien",
              "title": "The Lord of the Rings",
              "isbn": "0-395-19395-8",
              "price": 22.99
            }
        ],
        "bicycle":
        {
            "color": "red",
            "price": 19.95
        }
    }
}

 

Share this post


Link to post
Share on other sites
On 1/31/2020 at 11:25 PM, drjdpowell said:

A possibly better option is to replace your string/integer values with JSON strings, which is LabVIEW strings with <JSON> at the start of the name.  So "<JSON>Comment" rather than "Comment".   JSONtext will happily parse out the value into your cluster as JSON, then when you actually need your value you can convert it to string/integer, with appropriate handling if it is null or throws an error.

This method, by the way, is also how to handle JSON that has variable structure.

Tested this and it worked well. Had no idea you could add the <JSON> tag to parse complex data types like dictionaries. Super handy. This looks likes it's solved my problems. Thanks!

Share this post


Link to post
Share on other sites
On 2/3/2020 at 5:01 AM, camow7 said:

Any plans to include a "Set Null to Default" feature?

Unfortunately this contrasts with the current behaviour that null-->NaN for a floating-point number, rather than being the default number input.  In standard JSON, the float values NaN, Infinity and -Infinity have to become null, and to convert them back to a default value doesn't make sense.  We could add an option to "ignore null items" which would treat nulls as equivalent to that item not existing. 

  • Like 1

Share this post


Link to post
Share on other sites
On 1/31/2020 at 5:59 PM, pjr1121 said:

Is there a plan to implement conditional filters in the JSON paths?  For instance the following should return a single book title, but I get a parsing error due to the question mark.

Or is this already implemented in a different manner?

--tested on jsonpath.com--

$.store.book[?(@.category=='reference')].title

Plan?  Yes, but not a priority.   Note, though, that JSONtext returns substrings, meaning you can implement filtering in LabVIEW without making data copies, so the following code implements your example:

1925139157_JSONtextfilteringwithLabVIEW.png.9c67cd15e4d89c0d78552941e184b98b.png

More effort, of course, but it should be fast, and using LabVIEW is very flexible, and more debug-able.  

Share this post


Link to post
Share on other sites

Hi, awesome work on the library, is it possible to make it compatible with Labview 2014? Thank you!!

Share this post


Link to post
Share on other sites
5 hours ago, direheart said:

is it possible to make it compatible with Labview 2014?

No, unfortunately, as it uses VIMs that are only availablee in 2017+

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.