2828# interface to/from
2929def to_json (path_or_buf , obj , orient = None , date_format = 'epoch' ,
3030 double_precision = 10 , force_ascii = True , date_unit = 'ms' ,
31- default_handler = None , lines = False , compression = None ):
31+ default_handler = None , lines = False , compression = None ,
32+ index = True ):
33+
34+ if not index and orient not in ['split' , 'table' ]:
35+ raise ValueError ("'index=False' is only valid when 'orient' is "
36+ "'split' or 'table'" )
3237
3338 path_or_buf = _stringify_path (path_or_buf )
3439 if lines and orient != 'records' :
@@ -49,7 +54,8 @@ def to_json(path_or_buf, obj, orient=None, date_format='epoch',
4954 s = writer (
5055 obj , orient = orient , date_format = date_format ,
5156 double_precision = double_precision , ensure_ascii = force_ascii ,
52- date_unit = date_unit , default_handler = default_handler ).write ()
57+ date_unit = date_unit , default_handler = default_handler ,
58+ index = index ).write ()
5359
5460 if lines :
5561 s = _convert_to_line_delimits (s )
@@ -69,7 +75,7 @@ def to_json(path_or_buf, obj, orient=None, date_format='epoch',
6975class Writer (object ):
7076
7177 def __init__ (self , obj , orient , date_format , double_precision ,
72- ensure_ascii , date_unit , default_handler = None ):
78+ ensure_ascii , date_unit , index , default_handler = None ):
7379 self .obj = obj
7480
7581 if orient is None :
@@ -81,6 +87,7 @@ def __init__(self, obj, orient, date_format, double_precision,
8187 self .ensure_ascii = ensure_ascii
8288 self .date_unit = date_unit
8389 self .default_handler = default_handler
90+ self .index = index
8491
8592 self .is_copy = None
8693 self ._format_axes ()
@@ -89,14 +96,20 @@ def _format_axes(self):
8996 raise AbstractMethodError (self )
9097
9198 def write (self ):
99+ return self ._write (self .obj , self .orient , self .double_precision ,
100+ self .ensure_ascii , self .date_unit ,
101+ self .date_format == 'iso' , self .default_handler )
102+
103+ def _write (self , obj , orient , double_precision , ensure_ascii ,
104+ date_unit , iso_dates , default_handler ):
92105 return dumps (
93- self . obj ,
94- orient = self . orient ,
95- double_precision = self . double_precision ,
96- ensure_ascii = self . ensure_ascii ,
97- date_unit = self . date_unit ,
98- iso_dates = self . date_format == 'iso' ,
99- default_handler = self . default_handler
106+ obj ,
107+ orient = orient ,
108+ double_precision = double_precision ,
109+ ensure_ascii = ensure_ascii ,
110+ date_unit = date_unit ,
111+ iso_dates = iso_dates ,
112+ default_handler = default_handler
100113 )
101114
102115
@@ -108,6 +121,15 @@ def _format_axes(self):
108121 raise ValueError ("Series index must be unique for orient="
109122 "'{orient}'" .format (orient = self .orient ))
110123
124+ def _write (self , obj , orient , double_precision , ensure_ascii ,
125+ date_unit , iso_dates , default_handler ):
126+ if not self .index and orient == 'split' :
127+ obj = {"name" : obj .name , "data" : obj .values }
128+ return super (SeriesWriter , self )._write (obj , orient ,
129+ double_precision ,
130+ ensure_ascii , date_unit ,
131+ iso_dates , default_handler )
132+
111133
112134class FrameWriter (Writer ):
113135 _default_orient = 'columns'
@@ -123,12 +145,22 @@ def _format_axes(self):
123145 raise ValueError ("DataFrame columns must be unique for orient="
124146 "'{orient}'." .format (orient = self .orient ))
125147
148+ def _write (self , obj , orient , double_precision , ensure_ascii ,
149+ date_unit , iso_dates , default_handler ):
150+ if not self .index and orient == 'split' :
151+ obj = obj .to_dict (orient = 'split' )
152+ del obj ["index" ]
153+ return super (FrameWriter , self )._write (obj , orient ,
154+ double_precision ,
155+ ensure_ascii , date_unit ,
156+ iso_dates , default_handler )
157+
126158
127159class JSONTableWriter (FrameWriter ):
128160 _default_orient = 'records'
129161
130162 def __init__ (self , obj , orient , date_format , double_precision ,
131- ensure_ascii , date_unit , default_handler = None ):
163+ ensure_ascii , date_unit , index , default_handler = None ):
132164 """
133165 Adds a `schema` attribut with the Table Schema, resets
134166 the index (can't do in caller, because the schema inference needs
@@ -137,7 +169,7 @@ def __init__(self, obj, orient, date_format, double_precision,
137169 """
138170 super (JSONTableWriter , self ).__init__ (
139171 obj , orient , date_format , double_precision , ensure_ascii ,
140- date_unit , default_handler = default_handler )
172+ date_unit , index , default_handler = default_handler )
141173
142174 if date_format != 'iso' :
143175 msg = ("Trying to write with `orient='table'` and "
@@ -146,7 +178,7 @@ def __init__(self, obj, orient, date_format, double_precision,
146178 .format (fmt = date_format ))
147179 raise ValueError (msg )
148180
149- self .schema = build_table_schema (obj )
181+ self .schema = build_table_schema (obj , index = self . index )
150182
151183 # NotImplementd on a column MultiIndex
152184 if obj .ndim == 2 and isinstance (obj .columns , MultiIndex ):
@@ -168,14 +200,24 @@ def __init__(self, obj, orient, date_format, double_precision,
168200 if is_period_dtype (obj .index ):
169201 obj .index = obj .index .to_timestamp ()
170202
171- self .obj = obj .reset_index ()
203+ # exclude index from obj if index=False
204+ if not self .index :
205+ self .obj = obj .reset_index (drop = True )
206+ else :
207+ self .obj = obj .reset_index (drop = False )
172208 self .date_format = 'iso'
173209 self .orient = 'records'
174-
175- def write (self ):
176- data = super (JSONTableWriter , self ).write ()
210+ self .index = index
211+
212+ def _write (self , obj , orient , double_precision , ensure_ascii ,
213+ date_unit , iso_dates , default_handler ):
214+ data = super (JSONTableWriter , self )._write (obj , orient ,
215+ double_precision ,
216+ ensure_ascii , date_unit ,
217+ iso_dates ,
218+ default_handler )
177219 serialized = '{{"schema": {schema}, "data": {data}}}' .format (
178- schema = dumps (self .schema ), data = data )
220+ schema = dumps (self .schema ), data = data )
179221 return serialized
180222
181223
0 commit comments