0

We need to create a for each loop that creates an array from a JSON call. I am new to flutter so I am looking for the best way to do this performance wise. Here is the existing code as of right now:

This is the array format we need to loop thru the JSON call and create

var ForumPostArr = [
  new ForumPostEntry("User1", "2 Days ago", 0 , 0 , "Hello,\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."),
  new ForumPostEntry("User2", "23 Hours ago", 1 , 0 , "Pellentesque justo metus, finibus porttitor consequat vitae, tincidunt vitae quam. Vestibulum molestie sem diam. Nullam pretium semper tempus. Maecenas lobortis lacus nunc, id lacinia nunc imperdiet tempor. Mauris mi ipsum, finibus consectetur eleifend a, maximus eget lorem. Praesent a magna nibh. In congue sapien sed velit mattis sodales. Nam tempus pulvinar metus, in gravida elit tincidunt in. Curabitur sed sapien commodo, fringilla tortor eu, accumsan est. Proin tincidunt convallis dolor, a faucibus sapien auctor sodales. Duis vitae dapibus metus. Nulla sit amet porta ipsum, posuere tempor tortor.\n\nCurabitur mauris dolor, cursus et mi id, mattis sagittis velit. Duis eleifend mi et ante aliquam elementum. Ut feugiat diam enim, at placerat elit semper vitae. Phasellus vulputate quis ex eu dictum. Cras sapien magna, faucibus at lacus vel, faucibus viverra lorem. Phasellus quis dui tristique, ultricies velit non, cursus lectus. Suspendisse neque nisl, vestibulum non dui in, vulputate placerat elit. Sed at convallis mauris, eu blandit dolor. Vivamus suscipit iaculis erat eu condimentum. Aliquam erat volutpat. Curabitur posuere commodo arcu vel consectetur."),
  new ForumPostEntry("User3", "2 Days ago", 5 , 0 , "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."),
  new ForumPostEntry("User4", "2 Days ago", 0 , 0 , "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."),
  ];

Here is the JSON call returning multiple answer objects

Future<ForumAnswers> getForumAnswers(String postID) async {
   final response =
  await http.post('/api/ForumAnswers',
  headers: {"Content-Type": "application/json", 
             'Accept': 'application/json',},
  body: json.encode({'PostID' : postID }));

  if (response.statusCode == 200) {
  // If the call to the server was successful, parse the JSON
   ForumAnswers _answers;
    _answers = ForumAnswers.fromJson(json.decode(response.body));

    return _answers;

    } else {
    // If that call was not successful, throw an error.
    throw Exception('Failed to load object');
  }

}
1
  • Can you add how sample response looks like in your post? Commented Mar 28, 2019 at 16:31

1 Answer 1

1

This question could use a whole lot more information, but there's enough to go by. There are two ways of doing this - the simplest is to use the json decoder from the convert library and to manually decode. The other option is to use the json serialization library which uses code generation at compile time to create serialization/deserialization routines for your class.

I won't go into code generation, but this is how I'd do it manually:

import 'dart:convert';

class ForumAnswers {
  final List<ForumAnswer> answers;

  ForumAnswers(this.answers);

  factory ForumAnswers.fromJson(String jsonText) {
    return ForumAnswers((json.decode(jsonText) as List).map((item) => ForumAnswer.fromJson((item as Map).cast())).toList());
  }

  @override
  String toString() {
    return answers.toString();
  }
}

class ForumAnswer {
  final String userId;
  final DateTime timestamp;
  final int views;
  final String text;

  ForumAnswer({this.userId, this.timestamp, this.views, this.text});

  String get daysAgo {
    int daysAgo = -timestamp.difference(DateTime.now()).inDays;
    if (daysAgo == 1) {
      return "1 day ago";
    } else {
      return "$daysAgo days ago";
    }
  }

  static const String USERID = "userid";
  static const String TIMESTAMP = "timestamp";
  static const String VIEWS = "views";
  static const String TEXT = "text";

  factory ForumAnswer.fromJson(Map<String, dynamic> map) {
    String userId = map[USERID];
    String dateTimeString = map[TIMESTAMP];
    int views = map[VIEWS];
    String text = map[TEXT];

    DateTime dateTime = DateTime.parse(dateTimeString);

    return ForumAnswer(userId: userId, timestamp: dateTime, views: views, text: text);
  }

  @override
  String toString() {
    return "$runtimeType(userid=$userId, ago=$daysAgo, views=$views, text=$text)";
  }
}

void main() {
  String json = """
  [
    {"userid": "User1", "timestamp": "2019-03-24 13:27:00.123456z", "views": 3, "text": "Hello" },
    {"userid": "User2", "timestamp": "2019-03-28 13:30:00.234234z", "views": 2, "text": "Hello to you too" },
    {"userid": "User1", "timestamp": "2019-03-29 13:42:00.982178z", "views": 1, "text": "Goodbye" }
  ]
  """;

  print("Decoded from json: ${ForumAnswers.fromJson(json)}");
}

Or see that in dartpad.

This makes a few assumptions that were missing from your question though... for example what the ForumAnswer and ForumAnswers classes actually are about, what the json you're getting back looks like, and what the parameters are in your ForumPostEntry. But you should be able to make the changes to do what you want from this code.

I'd recommend reading flutter's documentation for json as it explains basically the same as what my code is doing as well as how to use the serialization library.

Sign up to request clarification or add additional context in comments.

3 Comments

thanks for the help. One question, why does it print [ForumAnswer(userid=User1, timestamp=2012-02-27 13:27:00.123Z, views=3, text=Hello),
the format we need is : new ForumPostEntry("User1", "2 Days ago", 0 , 0 , "Hello,\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."),
Well since you didn't really give a whole lot of information, I just went with the basics and thought I'd leave the rest to you. If you want to make it print "2 days ago" that's easy enough, I'll update the example.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.