It looks like the output from json2on.exe is wrong when you use the current json file format. The current json file format records the control points without multiplying coordinates by the weights. It seems that json2on.exe needs the control points with the weights applied. If you simply multiple the coordinates of the control points by the weight, then json2on.exe will produce the correct output.
To Reproduce
Run the fiberInGroove.py script. This will output json file that should contain a cylindrical NURBS surface named fiberSurface.json.
Run json2on.exe fiberSurface.json to produce fiberSurface.3dm
Launch Rhino. Import fiberSurface.3dm and see that geometry is distorted because control points are not located correctly.
Import fiberSurfaceMod3_Correct.json and see that it is semi-cylindrical surface. The control points in this .json file have been multiplied by the weights listed at the end of the .json file.
These screen snapshots illustrate the differences between the two json files.
RhinoScreenSnapshots.zip
Maybe you want to think about adding a switch to the export json function that allows you to select which version of control points to export?
It looks like the output from json2on.exe is wrong when you use the current json file format. The current json file format records the control points without multiplying coordinates by the weights. It seems that json2on.exe needs the control points with the weights applied. If you simply multiple the coordinates of the control points by the weight, then json2on.exe will produce the correct output.
To Reproduce
These screen snapshots illustrate the differences between the two json files. RhinoScreenSnapshots.zip
Maybe you want to think about adding a switch to the export json function that allows you to select which version of control points to export?