2015-05-19 1 views
1

Этот вопрос связан с this post.Как создать json кодируемые классы в дротике

Я попытался следующий код:

import 'dart:convert'; 

/*server side Post class */ 
class Post { 
    int post_id; 
    String title; 
    String description; 
    DateTime posted_at; 
    DateTime last_edited; 
    String user; 
    String editor; 
    int up_votes; 
    int down_votes; 
    int total_votes; 
    String links_to; 
    List<String> tags = new List(); 

    Post.fromSQL(List sql_post) { 
    //initialization code, unrelated. 
    } 

    Map toJson(){ 
    Map fromObject = { 
     'post_id' : post_id, 
     'title' : title, 
     'description' : description, 
     'posted_at' : posted_at, 
     'last_edited' : last_edited, 
     'user' : user, 
     'editor' : editor, 
     'up_votes' : up_votes, 
     'dwon_votes' : down_votes, 
     'total_votes' : total_votes, 
     'links_to' : links_to, 
     'tags' : tags 
    }; 

    return fromObject; 
    //I use the code below as a temporary solution 
    //JSON.encode(fromObject, toEncodable: (date)=>date.toString()); 
    } 
} 

У меня есть временное решение, но я действительно хотел бы быть в состоянии сделать следующее.

JSON.encode(posts, toEncodable: (date)=>date.toString()) 

где posts список постовских объектов. Я бы ожидал, что это преобразуется в json-список json-представлений класса Post. Я получаю список строк "Instance of 'Post'". Итак, вопрос в том, что этот синтаксис больше не поддерживается, или я должен делать что-то по-другому?

ответ

1

Возможно, вы используете только toEncodable:ИЛИtoJson() резерв.

Если вы обернуть Дата в классе, который обеспечивает toJson() вам не нужно использовать toEncodable::

class JsonDateTime { 
    final DateTime value; 
    JsonDateTime(this.value); 

    String toJson() => value != null ? value.toIso8601String() : null; 
} 

class Post { 
    ... 
    Map toJson() => { 
    'post_id' : post_id, 
    'title' : title, 
    'description' : description, 
    'posted_at' : new JsonDateTime(posted_at), 
    'last_edited' : new JsonDateTime(last_edited), 
    'user' : user, 
    'editor' : editor, 
    'up_votes' : up_votes, 
    'dwon_votes' : down_votes, 
    'total_votes' : total_votes, 
    'links_to' : links_to, 
    'tags' : tags 
    }; 
} 

или же убедиться, что ваш toEncodeable: обрабатывает каждый тип не поддерживается:

print(JSON.encode(data, toEncodable: (value) { 
    if (value is DateTime) { 
    return value.toIso8601String(); 
    } else { 
    return value.toJson(); 
    } 
})); 
+0

I неправильно поняли документацию. Я боролся с 'toEncodable' запускается на тех подэлементах объекта, который был возвращен toJson(), которые не кодируются. Я решил это, слегка изменив карту следующим образом: '' posted_at ': posted_at.toIso8601String(),' last_edited ': last_edited.toIso8601String(), 'и полностью удалил' toEncodable'. – Lukasz

+0

Это было бы неплохо, но, похоже, не так. Разумеется, это тоже хорошее решение. –

+1

Функция 'toEncodable' - это функция, которую нельзя использовать, нет другого резерва для объекта unencodable. Вызов 'toJson' - это только функция' toEncodable' по умолчанию, если вы не предоставляете другую. – lrn