Skip to content

Commit 87a8ad7

Browse files
JSON deserialization - simple values in collections (refs #188)
1 parent 3ec9264 commit 87a8ad7

File tree

6 files changed

+52
-12
lines changed

6 files changed

+52
-12
lines changed

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/ext/JsonDeserializationExtension.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -227,11 +227,14 @@ private static TsIfStatement ifUndefinedThenReturnItStatement(String identifier)
227227

228228
private static TsExpression getPropertyCopy(SymbolTable symbolTable, TsModel tsModel, TsBeanModel bean, TsPropertyModel property) {
229229
final TsExpression copyFunction = getCopyFunctionForTsType(symbolTable, tsModel, property.getTsType());
230-
if (copyFunction instanceof TsIdentifierReference) {
231-
final TsIdentifierReference reference = (TsIdentifierReference) copyFunction;
232-
if (reference.getIdentifier().equals("__identity")) {
233-
// function degenerates to the same value (data.property)
234-
return new TsMemberExpression(new TsIdentifierReference("data"), property.name);
230+
if (copyFunction instanceof TsCallExpression) {
231+
final TsCallExpression callExpression = (TsCallExpression) copyFunction;
232+
if (callExpression.getExpression() instanceof TsIdentifierReference) {
233+
final TsIdentifierReference reference = (TsIdentifierReference) callExpression.getExpression();
234+
if (reference.getIdentifier().equals("__identity")) {
235+
// function degenerates to the same value (data.property)
236+
return new TsMemberExpression(new TsIdentifierReference("data"), property.name);
237+
}
235238
}
236239
}
237240
return new TsCallExpression(
@@ -289,7 +292,11 @@ private static TsExpression getCopyFunctionForTsType(SymbolTable symbolTable, Ts
289292
return new TsIdentifierReference("constructorFnOf" + genericVariableType.name);
290293
}
291294
// __identity
292-
return new TsIdentifierReference("__identity");
295+
return new TsCallExpression(
296+
new TsIdentifierReference("__identity"),
297+
Arrays.asList(tsType),
298+
Collections.<TsExpression>emptyList()
299+
);
293300
}
294301

295302
private static TsMethodModel createDeserializationMethodForTaggedUnion(SymbolTable symbolTable, TsModel tsModel, TsBeanModel bean) {

typescript-generator-core/src/main/resources/helpers/jsonDeserialization.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,6 @@ function __copyObject<T>(object: { [index: string]: T }, itemCopyFn: (item: T) =
2424
return result;
2525
}
2626

27-
function __identity<T>(value: T): T {
28-
return value;
27+
function __identity<T>(): (value: T) => T {
28+
return value => value;
2929
}

typescript-generator-core/src/test/java/cz/habarta/typescript/generator/JsonDeserializationTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ private static class User {
7777
public Map<String, Address> taggedAddresses;
7878
public Map<String, List<Address>> groupedAddresses;
7979
public List<Map<String, Address>> listOfTaggedAddresses;
80+
public List<String> tags;
81+
public Map<String, String> mapping;
82+
public List<List<String>> listOfListOfString;
8083
public PagedList<Order, Authentication> orders;
8184
public List<PagedList<Order, Authentication>> allOrders;
8285
public Shape shape;

typescript-generator-core/src/test/resources/cz/habarta/typescript/generator/JsonDeserializationTest-expected.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ export class User {
99
taggedAddresses: { [index: string]: Address };
1010
groupedAddresses: { [index: string]: Address[] };
1111
listOfTaggedAddresses: { [index: string]: Address }[];
12+
tags: string[];
13+
mapping: { [index: string]: string };
14+
listOfListOfString: string[][];
1215
orders: PagedList<Order, Authentication>;
1316
allOrders: PagedList<Order, Authentication>[];
1417
shape: ShapeUnion;
@@ -28,8 +31,11 @@ export class User {
2831
instance.taggedAddresses = __getCopyObjectFn(Address.fromData)(data.taggedAddresses);
2932
instance.groupedAddresses = __getCopyObjectFn(__getCopyArrayFn(Address.fromData))(data.groupedAddresses);
3033
instance.listOfTaggedAddresses = __getCopyArrayFn(__getCopyObjectFn(Address.fromData))(data.listOfTaggedAddresses);
31-
instance.orders = PagedList.fromDataFn<Order, Authentication>(Order.fromData, __identity)(data.orders);
32-
instance.allOrders = __getCopyArrayFn(PagedList.fromDataFn<Order, Authentication>(Order.fromData, __identity))(data.allOrders);
34+
instance.tags = __getCopyArrayFn(__identity<string>())(data.tags);
35+
instance.mapping = __getCopyObjectFn(__identity<string>())(data.mapping);
36+
instance.listOfListOfString = __getCopyArrayFn(__getCopyArrayFn(__identity<string>()))(data.listOfListOfString);
37+
instance.orders = PagedList.fromDataFn<Order, Authentication>(Order.fromData, __identity<Authentication>())(data.orders);
38+
instance.allOrders = __getCopyArrayFn(PagedList.fromDataFn<Order, Authentication>(Order.fromData, __identity<Authentication>()))(data.allOrders);
3339
instance.shape = Shape.fromDataUnion(data.shape);
3440
instance.shapes = __getCopyArrayFn(Shape.fromDataUnion)(data.shapes);
3541
return instance;
@@ -204,6 +210,6 @@ function __copyObject<T>(object: { [index: string]: T }, itemCopyFn: (item: T) =
204210
return result;
205211
}
206212

207-
function __identity<T>(value: T): T {
208-
return value;
213+
function __identity<T>(): (value: T) => T {
214+
return value => value;
209215
}

typescript-generator-core/src/test/ts/JsonDeserializationTest/JsonDeserializationTest-expected-test-data.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,17 @@
3535
}
3636
}
3737
],
38+
"tags": [
39+
"item"
40+
],
41+
"mapping": {
42+
"key": "value"
43+
},
44+
"listOfListOfString": [
45+
[
46+
"string"
47+
]
48+
],
3849
"orders": {
3950
"page": 7,
4051
"items": [

typescript-generator-core/src/test/ts/JsonDeserializationTest/JsonDeserializationTest-expected-test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,19 @@ assertType(user.listOfTaggedAddresses, Array);
4444
assertType(user.listOfTaggedAddresses[0], "object");
4545
assertType(user.listOfTaggedAddresses[0]["address6"], Address);
4646

47+
// .tags
48+
assertType(user.tags, Array);
49+
assertType(user.tags[0], "string");
50+
51+
// .mapping
52+
assertType(user.mapping, "object");
53+
assertType(user.mapping["key"], "string");
54+
55+
// .listOfListOfString
56+
assertType(user.listOfListOfString, Array);
57+
assertType(user.listOfListOfString[0], Array);
58+
assertType(user.listOfListOfString[0][0], "string");
59+
4760
// .orders
4861
assertType(user.orders, PagedList);
4962
assertType(user.orders.page, "number");

0 commit comments

Comments
 (0)