28
28
# interface to/from
29
29
def to_json (path_or_buf , obj , orient = None , date_format = 'epoch' ,
30
30
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'" )
32
37
33
38
path_or_buf = _stringify_path (path_or_buf )
34
39
if lines and orient != 'records' :
@@ -49,7 +54,8 @@ def to_json(path_or_buf, obj, orient=None, date_format='epoch',
49
54
s = writer (
50
55
obj , orient = orient , date_format = date_format ,
51
56
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 ()
53
59
54
60
if lines :
55
61
s = _convert_to_line_delimits (s )
@@ -69,7 +75,7 @@ def to_json(path_or_buf, obj, orient=None, date_format='epoch',
69
75
class Writer (object ):
70
76
71
77
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 ):
73
79
self .obj = obj
74
80
75
81
if orient is None :
@@ -81,6 +87,7 @@ def __init__(self, obj, orient, date_format, double_precision,
81
87
self .ensure_ascii = ensure_ascii
82
88
self .date_unit = date_unit
83
89
self .default_handler = default_handler
90
+ self .index = index
84
91
85
92
self .is_copy = None
86
93
self ._format_axes ()
@@ -89,14 +96,20 @@ def _format_axes(self):
89
96
raise AbstractMethodError (self )
90
97
91
98
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 ):
92
105
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
100
113
)
101
114
102
115
@@ -108,6 +121,15 @@ def _format_axes(self):
108
121
raise ValueError ("Series index must be unique for orient="
109
122
"'{orient}'" .format (orient = self .orient ))
110
123
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
+
111
133
112
134
class FrameWriter (Writer ):
113
135
_default_orient = 'columns'
@@ -123,12 +145,22 @@ def _format_axes(self):
123
145
raise ValueError ("DataFrame columns must be unique for orient="
124
146
"'{orient}'." .format (orient = self .orient ))
125
147
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
+
126
158
127
159
class JSONTableWriter (FrameWriter ):
128
160
_default_orient = 'records'
129
161
130
162
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 ):
132
164
"""
133
165
Adds a `schema` attribut with the Table Schema, resets
134
166
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,
137
169
"""
138
170
super (JSONTableWriter , self ).__init__ (
139
171
obj , orient , date_format , double_precision , ensure_ascii ,
140
- date_unit , default_handler = default_handler )
172
+ date_unit , index , default_handler = default_handler )
141
173
142
174
if date_format != 'iso' :
143
175
msg = ("Trying to write with `orient='table'` and "
@@ -146,7 +178,7 @@ def __init__(self, obj, orient, date_format, double_precision,
146
178
.format (fmt = date_format ))
147
179
raise ValueError (msg )
148
180
149
- self .schema = build_table_schema (obj )
181
+ self .schema = build_table_schema (obj , index = self . index )
150
182
151
183
# NotImplementd on a column MultiIndex
152
184
if obj .ndim == 2 and isinstance (obj .columns , MultiIndex ):
@@ -168,14 +200,24 @@ def __init__(self, obj, orient, date_format, double_precision,
168
200
if is_period_dtype (obj .index ):
169
201
obj .index = obj .index .to_timestamp ()
170
202
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 )
172
208
self .date_format = 'iso'
173
209
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 )
177
219
serialized = '{{"schema": {schema}, "data": {data}}}' .format (
178
- schema = dumps (self .schema ), data = data )
220
+ schema = dumps (self .schema ), data = data )
179
221
return serialized
180
222
181
223
0 commit comments