将 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 类 )

将 json 转换为 dart 时遇到问题,下面是 json

Dart 将 HTML 转换为 JSON

将json结果转换为日期[重复]

如何将 bigquery 返回的结果转换为 Json