将 json 结果转换为 dart 模型
Posted
技术标签:
【中文标题】将 json 结果转换为 dart 模型【英文标题】:converting json result to dart model 【发布时间】:2020-11-10 23:56:42 【问题描述】:我在 API 上使用了一些泛型类型来返回 json 结果低于的数据
"apiResult":
"dataResult":
"accessToken": "access_token_string",
"refreshToken": "refresh_token_string"
,
"dataIsSuccess": true,
"dataError": "Service name : LoginService - No error",
"dataCustomError": "Service name : LoginService - No custom error",
"dataReturnCode": 200,
"dataCount": null
,
"apiException": "NO_ERROR_FROM_API",
"apiCustomException": "Method name : ApplicationUserLoginAsync",
"apiReturnCode": 200,
"apiIsSuccess": true
dataResult 是我的数据库结果模型,它是一个通用类型(它可以是令牌响应模型或产品列表)。所以我需要将此 json 模型转换为 DART 类。 我已经尝试了一些代码,但无法按照我的意愿进行操作
需要帮助。
编辑
我尝试了一些在线工具来生成 dart 类代码,但我遇到的问题是 dataResult 属性是一个通用属性,如下所示
public class DataReturn<T>
public T DataResult get; set;
public bool DataIsSuccess get; set;
public string DataError get; set;
public string DataCustomError get; set;
public int DataReturnCode get; set;
public long? DataCount get; set;
所以我上面添加的 json 对象是通用 TokenResponseModel 到 DataReturn 类的实现。
所以我需要一个解决方案。
编辑 2
添加一些关于我的问题的信息。 首先在后端,我使用的是 net core web api。
web api 响应方法(如果结果正常)使用以下通用 OkObjectResult
public class BaseControllerReturn<T>
public OkObjectResult Ok(T t, string methodFullName)
ApiReturn<T> apiReturn = new ApiReturn<T>
ApiResult = t,
ApiException = "NO_ERROR_FROM_API",
ApiCustomException = $"Method name : methodFullName",
ApiReturnCode = (int)ApiMessageType.CAM200,
ApiIsSuccess = true
;
return new OkObjectResult(apiReturn);
和 ApiResult 类是
public class ApiReturn<T> : IApiReturn<T>
public T ApiResult get; set;
public string ApiException get; set;
public string ApiCustomException get; set;
public int ApiReturnCode get; set;
public bool ApiIsSuccess get; set;
Web Api 控制器操作方法返回如下
IDataReturn<ICollection<SomeEntity>> dataReturn;
var controllerReturn = new BaseControllerReturn<IDataReturn<ICollection<SomeEntity>>>();
....
....
....
return controllerReturn.Ok(dataReturn, ControllerName + " - " + MethodFullName);
DataReturn类你可以在上面看到。
所以 Web Api 方法在 DataReturn 泛型类中返回 DB 结果,Api 方法在 ApiResult 中返回 DataReturn 对象,我有如下 Api Return 对象
ApiReturn
"apiResult":
"dataResult":
"accessToken": "access_token_string",
"refreshToken": "refresh_token_string"
,
"dataIsSuccess": true,
"dataError": "Service name : LoginService - No error",
"dataCustomError": "Service name : LoginService - No custom error",
"dataReturnCode": 200,
"dataCount": null
,
"apiException": "NO_ERROR_FROM_API",
"apiCustomException": "Method name : ApplicationUserLoginAsync",
"apiReturnCode": 200,
"apiIsSuccess": true
在这个例子中 SomeEntity 是
public class TokenResponseModel
public string AccessToken get; set;
public string RefreshToken get; set;
所以我希望这些信息足以澄清问题。
编辑 3:
来自使用相同 ApiResult 和 DataResult 泛型类的 Web api 的另一个响应。
"apiResult":
"dataResult": [
"stockDetailId": "ac9d6aac-3b0e-42f7-ba87-85cf6647cde9",
"stockDetail":
"stockId": "8802d1e0-b044-4986-9e44-74f68fe2068e",
"secondCurrency": 0,
"thirdCurrency": 0,
"retailVatType": 4,
"ecommerce": false,
"description": null,
"id": "ac9d6aac-3b0e-42f7-ba87-85cf6647cde9",
"isActive": true,
"createdUser": "ed086e08-fbdf-4974-d566-08d7cb0d5a98",
"createdDate": "2020-07-25T14:15:42.0056828",
"updatedUser": "ed086e08-fbdf-4974-d566-08d7cb0d5a98",
"updatedDate": "2020-07-25T14:15:42.0056828"
,
"vendorId": null,
"vendor": null,
"manufacturerId": null,
"manufacturer": null,
"priceListId": null,
"priceList": null,
"discountMatrixId": null,
"discountMatrix": null,
"stockEcommerceId": null,
"stockEcommerce": null,
"stockOpenCarts": null,
"stockUnits": null,
"stockBarcodes": null,
"stockGroups": null,
"stockCategories": null,
"stockFiles": null,
"accountMatchings": null,
"code": "334472",
"name": "YETIS MATIK DAG ESINTISI 2500GR*6",
"currencyType": 1,
"vatType": 4,
"sellingPrice": null,
"id": "8802d1e0-b044-4986-9e44-74f68fe2068e",
"isActive": true,
"createdUser": "ed086e08-fbdf-4974-d566-08d7cb0d5a98",
"createdDate": "2020-07-25T14:15:42.0056828",
"updatedUser": "ed086e08-fbdf-4974-d566-08d7cb0d5a98",
"updatedDate": "2020-07-25T14:15:42.0056828"
],
"dataIsSuccess": true,
"dataError": "Service name : StockService - No error",
"dataCustomError": "Service name : StockService - No custom error",
"dataReturnCode": 200,
"dataCount": 1
,
"apiException": "NO_ERROR_FROM_API",
"apiCustomException": "Method name : StocksController - ListAsync",
"apiReturnCode": 200,
"apiIsSuccess": true
【问题讨论】:
这段代码甚至不像 dart。 是的,它不是。这是 C# API 代码。 那么请澄清您的问题。不清楚你在问什么。 【参考方案1】:您可以使用quicktype.io 之类的工具将 json 转换为 dart 类。
// To parse this JSON data, do
//
// final generalPublicLoginResponse = generalPublicLoginResponseFromJson(jsonString);
import 'dart:convert';
GeneralPublicLoginResponse generalPublicLoginResponseFromJson(String str) => GeneralPublicLoginResponse.fromJson(json.decode(str));
String generalPublicLoginResponseToJson(GeneralPublicLoginResponse data) => json.encode(data.toJson());
class GeneralPublicLoginResponse
GeneralPublicLoginResponse(
this.apiResult,
this.apiException,
this.apiCustomException,
this.apiReturnCode,
this.apiIsSuccess,
);
ApiResult apiResult;
String apiException;
String apiCustomException;
int apiReturnCode;
bool apiIsSuccess;
factory GeneralPublicLoginResponse.fromJson(Map<String, dynamic> json) => GeneralPublicLoginResponse(
apiResult: ApiResult.fromJson(json["apiResult"]),
apiException: json["apiException"],
apiCustomException: json["apiCustomException"],
apiReturnCode: json["apiReturnCode"],
apiIsSuccess: json["apiIsSuccess"],
);
Map<String, dynamic> toJson() =>
"apiResult": apiResult.toJson(),
"apiException": apiException,
"apiCustomException": apiCustomException,
"apiReturnCode": apiReturnCode,
"apiIsSuccess": apiIsSuccess,
;
class ApiResult
ApiResult(
this.dataResult,
this.dataIsSuccess,
this.dataError,
this.dataCustomError,
this.dataReturnCode,
this.dataCount,
);
DataResult dataResult;
bool dataIsSuccess;
String dataError;
String dataCustomError;
int dataReturnCode;
dynamic dataCount;
factory ApiResult.fromJson(Map<String, dynamic> json) => ApiResult(
dataResult: DataResult.fromJson(json["dataResult"]),
dataIsSuccess: json["dataIsSuccess"],
dataError: json["dataError"],
dataCustomError: json["dataCustomError"],
dataReturnCode: json["dataReturnCode"],
dataCount: json["dataCount"],
);
Map<String, dynamic> toJson() =>
"dataResult": dataResult.toJson(),
"dataIsSuccess": dataIsSuccess,
"dataError": dataError,
"dataCustomError": dataCustomError,
"dataReturnCode": dataReturnCode,
"dataCount": dataCount,
;
class DataResult
DataResult(
this.accessToken,
this.refreshToken,
);
String accessToken;
String refreshToken;
factory DataResult.fromJson(Map<String, dynamic> json) => DataResult(
accessToken: json["accessToken"],
refreshToken: json["refreshToken"],
);
Map<String, dynamic> toJson() =>
"accessToken": accessToken,
"refreshToken": refreshToken,
;
【讨论】:
以上是关于将 json 结果转换为 dart 模型的主要内容,如果未能解决你的问题,请参考以下文章
使用 ObjectMapper - 如何将 JSON 结果快速转换为 TableView
FlutterJSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )