首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为API调用Xml2Json建立Json模型

为API调用Xml2Json建立Json模型
EN

Stack Overflow用户
提问于 2021-12-03 16:54:37
回答 1查看 93关注 0票数 0

我正在调用一个在XMl中返回数据的Api

然后,我使用XML将其从Json转换为Xml2Json,然后解码并获取一个JsonMap,这将很好地返回一个映射。

然后,当我去做locations.fromJson,以便能够从我的模型中调用数据时,它是作为null返回的。

我想从XML转换可能会很复杂,但我已经尝试了所有的可能性,解析了整个响应,分析了我需要的部分,并以所有可能的方式修改了模型。

数据以Json的形式返回很好,但是当使用通过quicktype.io生成的模型解析它时,只会有一些断开。

当我以任何方式调用它时,无论是print还是数据检索,它都会在null上返回vehicleActivity

打电话

代码语言:javascript
复制
Future<Locations> fetchLiveLocations() async {
    var client = http.Client();
    var locations;
    Xml2Json xml2Json = new Xml2Json(); 

    
 try{
    var response = await client.get(
    'https_call');    
    if (response.statusCode == 200) {
    xml2Json.parse(response.body);
    var jsonString = xml2Json.toGData();
    var jsonMap = json.decode(jsonString);
    //jsonMap is returning fine

    locations = Locations.fromJson(jsonMap);
    //Returning as null

  }
 } catch(Exception) {
  return locations;
 }

  return locations;
 }   

Json模型的上部

代码语言:javascript
复制
import 'dart:convert';

Locations locationsFromJson(String str) => Locations.fromJson(json.decode(str));

String locationsToJson(Locations data) => json.encode(data.toJson());

class Locations {
    Locations({
        this.vehicleActivity,
    });

    List<VehicleActivity> vehicleActivity;

    factory Locations.fromJson(Map<String, dynamic> json) => Locations(
        vehicleActivity: List<VehicleActivity>.from(json["VehicleActivity"].map((x) => VehicleActivity.fromJson(x))),
    );

    Map<String, dynamic> toJson() => {
        "VehicleActivity": List<dynamic>.from(vehicleActivity.map((x) => x.toJson())),
    };
}

class VehicleActivity {
    VehicleActivity({
        this.recordedAtTime,
        this.itemIdentifier,
        this.validUntilTime,
        this.monitoredVehicleJourney,
        this.extensions,
    });

    DateTime recordedAtTime;
    String itemIdentifier;
    DateTime validUntilTime;
    MonitoredVehicleJourney monitoredVehicleJourney;
    Extensions extensions;

    factory VehicleActivity.fromJson(Map<String, dynamic> json) => VehicleActivity(
        recordedAtTime: DateTime.parse(json["RecordedAtTime"]),
        itemIdentifier: json["ItemIdentifier"],
        validUntilTime: DateTime.parse(json["ValidUntilTime"]),
        monitoredVehicleJourney: MonitoredVehicleJourney.fromJson(json["MonitoredVehicleJourney"]),
        extensions: Extensions.fromJson(json["Extensions"]),
    );

返回的XML文件

代码语言:javascript
复制
<Siri xmlns="http://www.siri.org.uk/siri" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.siri.org.uk/siri http://www.siri.org.uk/schema/2.0/xsd/siri.xsd" version="2.0">
<ServiceDelivery>
<ResponseTimestamp>2021-12-03T18:11:05.408806+00:00</ResponseTimestamp>
<ProducerRef>ItoWorld</ProducerRef>
<VehicleMonitoringDelivery>
<ResponseTimestamp>2021-12-03T18:11:05.408806+00:00</ResponseTimestamp>
<RequestMessageRef>5747b24f</RequestMessageRef>
<ValidUntil>2021-12-03T18:16:05.408806+00:00</ValidUntil>
<ShortestPossibleCycle>PT5S</ShortestPossibleCycle>

<VehicleActivity>
<RecordedAtTime>2021-12-03T18:10:01+00:00</RecordedAtTime>
<ItemIdentifier>ad2c7031-ceac-4e7c-bc0c-9e667ad00dfe</ItemIdentifier>
<ValidUntilTime>2021-12-03T18:16:05.408968</ValidUntilTime>
<MonitoredVehicleJourney>
<LineRef>4</LineRef>
<DirectionRef>inbound</DirectionRef>
<FramedVehicleJourneyRef>
<DataFrameRef>2021-12-03</DataFrameRef>
<DatedVehicleJourneyRef>4_20211203_18_04</DatedVehicleJourneyRef>
</FramedVehicleJourneyRef>
<PublishedLineName>4</PublishedLineName>
<OperatorRef>FTVA</OperatorRef>
<DestinationRef>03700324</DestinationRef>
<VehicleLocation>
<Longitude>-0.719601</Longitude>
<Latitude>51.520305</Latitude>
</VehicleLocation>
<Bearing>30.0</Bearing>
<BlockRef>801312</BlockRef>
<VehicleRef>69921</VehicleRef>
</MonitoredVehicleJourney>
<Extensions>
<VehicleJourney>
<Operational>
<TicketMachine>
<TicketMachineServiceCode>B4</TicketMachineServiceCode>
<JourneyCode>1815</JourneyCode>
</TicketMachine>
</Operational>
<VehicleUniqueId>69921</VehicleUniqueId>
<DriverRef>801312</DriverRef>
</VehicleJourney>
</Extensions>
</VehicleActivity>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-03 18:46:57

下面是一个示例VehicleActivity类--注意它不处理任何错误,比如缺少XML标记或不可解析的日期,您应该自己添加这些错误。

代码语言:javascript
复制
class VehicleActivity {
  VehicleActivity({
    this.recordedAtTime,
    this.itemIdentifier,
    this.validUntilTime,
  });

  DateTime? recordedAtTime;
  String? itemIdentifier;
  DateTime? validUntilTime;

  factory VehicleActivity.fromElement(XmlElement vaElement) => VehicleActivity(
        recordedAtTime: DateTime.parse(
          vaElement.findElements('RecordedAtTime').first.text,
        ),
        itemIdentifier: vaElement.findElements('ItemIdentifier').first.text,
        validUntilTime: DateTime.parse(
          vaElement.findElements('ValidUntilTime').first.text,
        ),
      );
}

对于它找到的每个vehicle活动标记,您可以使用封装标记中的工厂方法(类似于JSON解析器的编写方式)。(请注意,XML可以有多个同名标记,这就是为什么代码使用first查找(希望)一个也是唯一的标记的原因。如果您想正确地解析XML,就需要处理这个问题--并且注意,通过JSON的过程可能会打破这个问题--但是不能用简单的模式。)

下面是一个简单的示例,它只找到所有的车辆活动标记:

代码语言:javascript
复制
  final doc = XmlDocument.parse(utf8.decode(response.bodyBytes));
  final allActivities = doc
      .findAllElements('VehicleActivity')
      .map((e) => VehicleActivity.fromElement(e))
      .toList();
  print(allActivities);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70218002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档