我正在阅读Django REST Framework,我有一个使用SerializerMethodField()与getter序列化的模型.
但是,当我POST到此端点时,我希望能够设置此字段,但这不起作用,因为正如上面的文档所示,您无法写入SerializerMethodField.Django REST中是否有任何方法可以为您定义自定义getter方法的序列化器字段,以及自定义setter方法?
编辑:这是我正在尝试做的事情的来源.客户与用户具有一对一的关系.
class ClientSerializer(serializers.ModelSerializer):
email = serializers.SerializerMethodField()
def create(self, validated_data):
email = validated_data.get("email", None) # This doesn't work because email isn't passed into validated_data because it's a readonly field
# create the client and associated user here
def get_email(self, obj):
return obj.user.email
class Meta:
model = Client
fields = (
"id",
"email",
)
Run Code Online (Sandbox Code Playgroud) 在这里,我正在为REST API构建Symfony SDK.大多数数据都是具有嵌套的其他JSON对象的JSON对象.像这儿
{
"id": "eng_pl",
"name": "Premier League",
"_links": {
"self": {
"href": "/tournaments/eng_pl"
},
"seasons": {
"href": "/tournaments/eng_pl/seasons/"
}
},
"coverage": {
"id": "eng",
"name": "England",
"_links": {
"self": {
"href": "/territories/eng"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
反序列化必须生成一个与下面列出的代码生成的对象相等的对象:
$tournament = new Tournament();
$tournament->setId('eng_pl');
$tournament->setName('Premier League');
$coverage = new Territory();
$coverage->setId('eng');
$coverage->setName('England');
$tournament->setCoverage($coverage);
Run Code Online (Sandbox Code Playgroud)
我正在使用我自己的自定义Denormalizers,在Tournament对象的denormalizer代码片段下面:
class TournamentDenormalizer implements DenormalizerInterface
{
/**
* @inheritdoc
*/
public function supportsDenormalization($object, $type, $format = null)
{
if ($type != Tournament::class) {
return false;
} …Run Code Online (Sandbox Code Playgroud) 我正在使用symfony组件在Silex中进行一些编程,我想我发现了它symfony/serializer和symfony/validator组件的错误.
首先让我解释一下我要实现的目标,然后让我们去看看代码.我的目标是使用序列化指令和验证指令等信息来注释类.由于读取这些注释可能需要花费很少的cpu,我喜欢将它们缓存在内存中.为此,我在Doctrine/Common/Cache包中使用了memcache包装器.
我面临的问题是,使用类名作为键symfony/serializer,symfony/validator将元数据写入缓存.当他们稍后尝试检索元数据时,会抛出异常,因为缓存具有无效的元数据,或者是Symfony\Component\Validator\Mapping\ClassMetadata或的实例Symfony\Component\Serializer\Mapping\ClassMetadataInterface.
以下是一个可重复的例子(对不起,如果它的大,我试图做尽可能小):
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
class Foo
{
/**
* @var int
* @Assert\NotBlank(message="This field cannot be empty")
*/
private $someProperty;
/**
* @return int
* @Groups({"some_group"})
*/
public function getSomeProperty() {
return $this->someProperty;
}
}
use Doctrine\Common\Annotations\AnnotationReader;
use \Memcache as MemcachePHP;
use Doctrine\Common\Cache\MemcacheCache as MemcacheWrapper;
$loader = require_once __DIR__ . '/../vendor/autoload.php';
\Doctrine\Common\Annotations\AnnotationRegistry::registerLoader([$loader, 'loadClass']);
$memcache = new MemcachePHP();
if (! $memcache->connect('localhost', …Run Code Online (Sandbox Code Playgroud) 是否可以使用我自己的序列化程序替换Windows Communication Foundation中的dataContractSerializer.如果有可能,我该如何实现?
是否可以Symfony Serializer反序列化属性中的对象数组?我有一个Boss类$Npc = []需要持有一个Npc对象数组的属性.我确实在文档中看到了一些示例,但他们没有说明此功能.我有一个带有NPC数组的json字符串例如:
class Boss {
private $Npc = [];
/**
* @return Npc[]
*/
public function getNpcs(): array
{
return $this->npcs;
}
}
Run Code Online (Sandbox Code Playgroud)
我使用的是php7.1和symfony/serializer版本^ 3.3.
编辑:我已经尝试过PhpDocExtractor,但它不会让我安装它.:(
编辑:这是一个可能的JSON值:
{
"bossname": "Epic boss!",
"npcs": [{
"id": 24723,
"name": "Selin Fireheart",
"urlSlug": "selin-fireheart",
"creatureDisplayId": 22642
}]
}
Run Code Online (Sandbox Code Playgroud) 我在使用Newtonsoft.Json SerializeObject方法时遇到了一个错误.之前有人问过这个问题,但与Newtonsoft合作的人没有回答为什么会这样.
基本上,这样打电话时SerializeObject:
string json = Newtonsoft.Json.JsonConvert.SerializeObject(from, new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All });
Run Code Online (Sandbox Code Playgroud)
我Equals在我的类中覆盖了很多方法中的错误:
public override bool Equals(object obj)
{
if (obj == null)
return false;
CapacityConfiguration cc = (CapacityConfiguration)obj; // <-- TypeCastException here; other Properties of the same class are sent in as parameter!
}
Run Code Online (Sandbox Code Playgroud)
当然,通过这样检查,我意识到修复起来很"容易":
public override bool Equals(object obj)
{
if (obj is CapacityConfiguration == false)
return false;
CapacityConfiguration cc = (CapacityConfiguration)obj;
}
Run Code Online (Sandbox Code Playgroud)
但真正的问题是:
为什么Json.Net在类的Equals方法中发送其他类型的对象?更具体地说,Json.Net似乎在类中发送了许多其他属性,而不是相同类型的另一个对象.
对我来说,这完全是奇怪的.任何输入将不胜感激. …
很抱歉这似乎是一个多余的问题,但我确实有很多选择,尽管我努力阅读了十几个主题,但我无法理解该怎么做.
我有一个java应用程序,其工作是:
计划如下:
SOAP WS ---- deliverydate ----> JAVA APP(逻辑)---- datebl ----> REST WS
在Java应用程序是使用的JAR jackson-core-asl-1.9.13.jar和jackson-mapper-asl-1.9.13.jar等等.
我遇到的问题是处理日期.
读物:(试图受到启发但杰克逊版似乎不一样):
JSON以自定义格式序列化日期(无法从String值构造java.util.Date的实例)
Jackson 2.3.2:尽管将日期格式设置为ObjectMapper,但仍然会对Date进行反序列化
编辑01/04/15
http://jackson-users.ning.com/forum/topics/cannot-deserialize-a-date
现在的事实
要点1: 从SOAP WS恢复数据时,deliverydate是一个String,其精确值为:
2014-07-31 07:00:00.0
第2点: 在使用setter之前,我认为将此String格式化为日期可能是个好主意.
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dateebl = dateFormat.parse(deliverydate);
msi.setDatebl(dateebl);
Run Code Online (Sandbox Code Playgroud)
POJO中的datebl声明
private java.util.Date datebl;
Run Code Online (Sandbox Code Playgroud)
在此阶段,datebl值已转换为
Thu Jul 31 07:00:00 CEST 2014
(尽管选择具体格式yyyy-MM-dd HH:mm:ss)
点3和错误我有:我 的错误由其余服务器抛出:
无法从字符串值'Thu Jul 31 07:00:00 CEST 2014'构造java.util.Date的实例:不是有效的表示形式(错误:无法解析日期"Thu Jul 31 07:00:00 CEST 2014":不符合任何标准形式("yyyy-MM-dd'T'HH:mm:ss.SSSZ","yyyy-MM-dd'T'HH:mm:ss.SSS'Z'","EEE, dd MMM yyyy …
关于为数字,货币等创建Jackson序列化器的帖子很多.对于工程应用,通常需要根据单位或其他标准设置数字的精确度.
例如,空间坐标可能会被限制在小数点后的5或6位数,并且温度可能会被限制在小数点后的2位数.具有太多数字或截断指数表示法的默认序列化程序行为并不好.我需要的是:
@JsonSerialize(using=MyDoubleSerializer.class, precision=6) double myValue;
Run Code Online (Sandbox Code Playgroud)
并且更好地能够在运行时指定精度.我也在使用MixIn.我可以为每个类编写一个序列化程序,但希望指定具体的值.
任何想法,将不胜感激.
我有两个序列化器... MyRegisterSerializer继承并扩展了流行的应用程序/程序包django-rest-auth,该程序/程序包连接到相当标准的用户表。我还为定制应用程序TeamSerializer(与用户一对多关系)提供了模型和序列化器。当用户注册时,我希望他们能够同时加入一个团队,因此我需要以某种方式创建一个团队,返回团队ID,然后将该ID传递给RegisterSerializer,以便团队可以存储在用户表中。我知道我可以打两次电话,首先创建团队并返回值,然后将其传递给寄存器序列化器,但是有没有办法在一个序列化器中完成所有这些工作?我是python的n00b使用者,考虑到我必须按get_cleaned_data()原样返回函数,因此找不到很好的示例。谢谢!
class TeamSerializer(serializers.ModelSerializer):
class Meta:
model = Team
fields = ('id', 'name', 'logo', 'user')
class MyRegisterSerializer(RegisterSerializer):
first_name = serializers.CharField()
last_name = serializers.CharField()
def get_cleaned_data(self):
super(MyRegisterSerializer, self).get_cleaned_data()
return {
'team_id': <How do I get this value>
'username': self.validated_data.get('username', ''),
'position': self.validated_data.get('password1', ''),
'email': self.validated_data.get('email', ''),
'first_name': self.validated_data.get('first_name', ''),
'last_name': self.validated_data.get('last_name', '')
}
Run Code Online (Sandbox Code Playgroud) 使用Python 2.7,
我使用从multiprocessing.managers派生的管理器跨进程传递许多大对象.BaseManager我想用cPickle串行器来节省时间; 如何才能做到这一点?我看到BaseManager初始化程序接受一个serializer参数,但唯一的选项似乎是pickle和xmlrpclib.