To jest pytanie typu trzepotanie / strzałka, na wypadek gdybyś chciał zapytać.

Mam następujący JSONObject:

{
  "header": [
    2223,
    2224
  ],
  "2223": {
    "L": 3,
    "A": 6,
    "B": 5,
    "Mode": 15,
  },
  "2224": {
    "L": 9,
    "A": 6,
    "B": 1,
    "Mode": 16,
  }
}

Najpierw ładuję „spis treści” z obiektu nagłówka.

var tagsJson = jsonDecode(jsonContent)['header'];
List<String> timestamps = tagsJson != null ? List.from(tagsJson) : null;

A oto mój obiekt wyniku, do którego chcę przypisać wartości

  class Result {


  double L;
  double A;
  double B;
  int mode;

  Result({this.L, this.A, this.B, this.mode});


  void dump()
  {
    print(this.L);
    print(this.A);
    print(this.B);
    print(this.mode);
  }
}

Jak mogę uzyskać te wartości znaczników czasu JSONObjects i przypisać im odpowiedni obiekt wynikowy za pomocą flutter?

1
Vincent Guttmann 2 kwiecień 2020, 12:24

3 odpowiedzi

Najlepsza odpowiedź

Kiedy to zrobisz

var tagsJson = jsonDecode(jsonContent)['header'];

Zrzucasz resztę wartości JSON przez okno. Zamiast tego buforuj przeanalizowany kod JSON w pamięci podręcznej i odwołaj się do niego osobno:

final parsedJson = jsonDecode(jsonContent);
final tags = parsedJson['header'];
List<String> timestamps = tags != null ? List.from(tags) : null;

Będzie to również łatwiejsze i bardziej przejrzyste, jeśli utworzysz konstruktora fabrycznego fromJson dla Result:

class Result {
  ...

  factory Result.fromJson(Map<String, dynamic> jsonData) {
    double l = (jsonData['L'] ?? 0.0) as double;
    double a = (jsonData['A'] ?? 0.0) as double;
    double b = (jsonData['B'] ?? 0.0) as double;
    int mode = (jsonData['Mode'] ?? 0) as int;

    return Result(L: l, A: a, B: b, mode: mode);
  }

  ...
}

Teraz możesz iterować przez timestamps i tworzyć swoje Result:

List<Result> results = [];
for (var timestamp in timestamps) {
  final jsonData = parsedJson[timestamp];
  if (jsonData != null) {
    results.add(Result.fromJson(jsonData));
  }
}
1
Abion47 2 kwiecień 2020, 15:04

Utwórz tę funkcję w swoim obiekcie wynikowym

    /// Creates a [Result] model
    /// from a valid JSON Object
    ///
    factory Result.fromJson(Map<String, dynamic> json) => Result(
        L: json['L'],
        M: json['M'],
        B: json['B'],
        mode: json['Mode],
    );
1
Vincent Guttmann 5 kwiecień 2020, 07:10

Szybka odpowiedź to skorzystanie z tej biblioteki https://github.com/k-paxian/dart -json-mapper aby zmapować swój json na swoje klasy Dart.

"B*" ? czy to w jakimś celu czy literówka? w każdym razie tutaj jest piękny kod dla twojego przypadku, bez schematu, bez bólu, bez pętli, bez logiki. Dodatkową korzyścią jest zrzucenie modelu z powrotem do łańcucha json w jednej linii kodu.

// Here is the result model classes

@jsonSerializable
class ResultItem {
  num L;
  num A;
  num B;
  int Mode;
}

@jsonSerializable
class Result {
  List<num> header = [];

  final Map<String, dynamic> _itemsMap = {};

  @jsonProperty
  void setItem(String name, dynamic value) {
    _itemsMap[name] = JsonMapper.fromMap<ResultItem>(value);
  }

  @jsonProperty
  Map<String, dynamic> getItemsMap() {
    return _itemsMap;
  }
}

// here is the input json

      final json = '''
      {
        "header": [2223, 2224],
        "2223": {
                  "L": 3,
                  "A": 6,
                  "B": 5,
                  "Mode": 15
                },
        "2224": {
                  "L": 9,
                  "A": 6,
                  "B": 1,
                  "Mode": 16
                }
      }
 ''';

  // Now you have an result model instance populated from json in one line of code
  final resultInstance = JsonMapper.deserialize<Result>(json);

  // Now you have a result model instance back to json in one line of code
  print(JsonMapper.serialize(resultInstance));

Wyjście konsoli będzie

{
 "header": [
  2223,
  2224
 ],
 "2223": {
  "L": 3,
  "A": 6,
  "B": 5,
  "Mode": 15
 },
 "2224": {
  "L": 9,
  "A": 6,
  "B": 1,
  "Mode": 16
 }
}
1
Alexander Mazuruk 2 kwiecień 2020, 16:04