Browse Source

Ignore unknown enum value when ignore_unknown specified (#7455) (#7462)

Paul Yang 5 năm trước cách đây
mục cha
commit
d001f8cee4

+ 2 - 2
php/ext/google/protobuf/map.c

@@ -516,8 +516,8 @@ bool map_done(MapIter *iter) {
 }
 }
 
 
 const char *map_iter_key(MapIter *iter, int *len) {
 const char *map_iter_key(MapIter *iter, int *len) {
-  *len = upb_strtable_iter_keylength(&iter->it);
-  return upb_strtable_iter_key(&iter->it);
+  *len = upb_strtable_iter_key(&iter->it).size;
+  return upb_strtable_iter_key(&iter->it).data;
 }
 }
 
 
 upb_value map_iter_value(MapIter *iter, int *len) {
 upb_value map_iter_value(MapIter *iter, int *len) {

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 494 - 509
php/ext/google/protobuf/upb.c


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 594 - 456
php/ext/google/protobuf/upb.h


+ 26 - 18
php/src/Google/Protobuf/Internal/Message.php

@@ -773,10 +773,10 @@ class Message
      * @return null.
      * @return null.
      * @throws \Exception Invalid data.
      * @throws \Exception Invalid data.
      */
      */
-    public function mergeFromJsonString($data)
+    public function mergeFromJsonString($data, $ignore_unknown = false)
     {
     {
         $input = new RawInputStream($data);
         $input = new RawInputStream($data);
-        $this->parseFromJsonStream($input);
+        $this->parseFromJsonStream($input, $ignore_unknown);
     }
     }
 
 
     /**
     /**
@@ -801,6 +801,7 @@ class Message
     private function convertJsonValueToProtoValue(
     private function convertJsonValueToProtoValue(
         $value,
         $value,
         $field,
         $field,
+        $ignore_unknown,
         $is_map_key = false)
         $is_map_key = false)
     {
     {
         switch ($field->getType()) {
         switch ($field->getType()) {
@@ -849,7 +850,7 @@ class Message
                     } elseif (!is_object($value) && !is_array($value)) {
                     } elseif (!is_object($value) && !is_array($value)) {
                         throw new GPBDecodeException("Expect message.");
                         throw new GPBDecodeException("Expect message.");
                     }
                     }
-                    $submsg->mergeFromJsonArray($value);
+                    $submsg->mergeFromJsonArray($value, $ignore_unknown);
                 }
                 }
                 return $submsg;
                 return $submsg;
             case GPBType::ENUM:
             case GPBType::ENUM:
@@ -862,9 +863,12 @@ class Message
                 $enum_value = $field->getEnumType()->getValueByName($value);
                 $enum_value = $field->getEnumType()->getValueByName($value);
                 if (!is_null($enum_value)) {
                 if (!is_null($enum_value)) {
                     return $enum_value->getNumber();
                     return $enum_value->getNumber();
+                } else if ($ignore_unknown) {
+                    return $this->defaultValue($field);
+                } else {
+                  throw new GPBDecodeException(
+                          "Enum field only accepts integer or enum value name");
                 }
                 }
-                throw new GPBDecodeException(
-                        "Enum field only accepts integer or enum value name");
             case GPBType::STRING:
             case GPBType::STRING:
                 if (is_null($value)) {
                 if (is_null($value)) {
                     return $this->defaultValue($field);
                     return $this->defaultValue($field);
@@ -1125,17 +1129,17 @@ class Message
         }
         }
     }
     }
 
 
-    protected function mergeFromJsonArray($array)
+    protected function mergeFromJsonArray($array, $ignore_unknown)
     {
     {
         if (is_a($this, "Google\Protobuf\Any")) {
         if (is_a($this, "Google\Protobuf\Any")) {
             $this->clear();
             $this->clear();
             $this->setTypeUrl($array["@type"]);
             $this->setTypeUrl($array["@type"]);
             $msg = $this->unpack();
             $msg = $this->unpack();
             if (GPBUtil::hasSpecialJsonMapping($msg)) {
             if (GPBUtil::hasSpecialJsonMapping($msg)) {
-                $msg->mergeFromJsonArray($array["value"]);
+                $msg->mergeFromJsonArray($array["value"], $ignore_unknown);
             } else {
             } else {
                 unset($array["@type"]);
                 unset($array["@type"]);
-                $msg->mergeFromJsonArray($array);
+                $msg->mergeFromJsonArray($array, $ignore_unknown);
             }
             }
             $this->setValue($msg->serializeToString());
             $this->setValue($msg->serializeToString());
             return;
             return;
@@ -1171,7 +1175,7 @@ class Message
             $fields = $this->getFields();
             $fields = $this->getFields();
             foreach($array as $key => $value) {
             foreach($array as $key => $value) {
                 $v = new Value();
                 $v = new Value();
-                $v->mergeFromJsonArray($value);
+                $v->mergeFromJsonArray($value, $ignore_unknown);
                 $fields[$key] = $v;
                 $fields[$key] = $v;
             }
             }
         }
         }
@@ -1194,7 +1198,7 @@ class Message
                     }
                     }
                     foreach ($array as $key => $v) {
                     foreach ($array as $key => $v) {
                         $value = new Value();
                         $value = new Value();
-                        $value->mergeFromJsonArray($v);
+                        $value->mergeFromJsonArray($v, $ignore_unknown);
                         $values = $struct_value->getFields();
                         $values = $struct_value->getFields();
                         $values[$key]= $value;
                         $values[$key]= $value;
                     }
                     }
@@ -1207,7 +1211,7 @@ class Message
                     }
                     }
                     foreach ($array as $v) {
                     foreach ($array as $v) {
                         $value = new Value();
                         $value = new Value();
-                        $value->mergeFromJsonArray($v);
+                        $value->mergeFromJsonArray($v, $ignore_unknown);
                         $values = $list_value->getValues();
                         $values = $list_value->getValues();
                         $values[]= $value;
                         $values[]= $value;
                     }
                     }
@@ -1217,10 +1221,10 @@ class Message
             }
             }
             return;
             return;
         }
         }
-        $this->mergeFromArrayJsonImpl($array);
+        $this->mergeFromArrayJsonImpl($array, $ignore_unknown);
     }
     }
 
 
-    private function mergeFromArrayJsonImpl($array)
+    private function mergeFromArrayJsonImpl($array, $ignore_unknown)
     {
     {
         foreach ($array as $key => $value) {
         foreach ($array as $key => $value) {
             $field = $this->desc->getFieldByJsonName($key);
             $field = $this->desc->getFieldByJsonName($key);
@@ -1244,10 +1248,12 @@ class Message
                     $proto_key = $this->convertJsonValueToProtoValue(
                     $proto_key = $this->convertJsonValueToProtoValue(
                         $tmp_key,
                         $tmp_key,
                         $key_field,
                         $key_field,
+                        $ignore_unknown,
                         true);
                         true);
                     $proto_value = $this->convertJsonValueToProtoValue(
                     $proto_value = $this->convertJsonValueToProtoValue(
                         $tmp_value,
                         $tmp_value,
-                        $value_field);
+                        $value_field,
+                        $ignore_unknown);
                     self::kvUpdateHelper($field, $proto_key, $proto_value);
                     self::kvUpdateHelper($field, $proto_key, $proto_value);
                 }
                 }
             } else if ($field->isRepeated()) {
             } else if ($field->isRepeated()) {
@@ -1261,14 +1267,16 @@ class Message
                     }
                     }
                     $proto_value = $this->convertJsonValueToProtoValue(
                     $proto_value = $this->convertJsonValueToProtoValue(
                         $tmp,
                         $tmp,
-                        $field);
+                        $field,
+                        $ignore_unknown);
                     self::appendHelper($field, $proto_value);
                     self::appendHelper($field, $proto_value);
                 }
                 }
             } else {
             } else {
                 $setter = $field->getSetter();
                 $setter = $field->getSetter();
                 $proto_value = $this->convertJsonValueToProtoValue(
                 $proto_value = $this->convertJsonValueToProtoValue(
                     $value,
                     $value,
-                    $field);
+                    $field,
+                    $ignore_unknown);
                 if ($field->getType() === GPBType::MESSAGE) {
                 if ($field->getType() === GPBType::MESSAGE) {
                     if (is_null($proto_value)) {
                     if (is_null($proto_value)) {
                         continue;
                         continue;
@@ -1288,7 +1296,7 @@ class Message
     /**
     /**
      * @ignore
      * @ignore
      */
      */
-    public function parseFromJsonStream($input)
+    public function parseFromJsonStream($input, $ignore_unknown)
     {
     {
         $array = json_decode($input->getData(), true, 512, JSON_BIGINT_AS_STRING);
         $array = json_decode($input->getData(), true, 512, JSON_BIGINT_AS_STRING);
         if ($this instanceof \Google\Protobuf\ListValue) {
         if ($this instanceof \Google\Protobuf\ListValue) {
@@ -1304,7 +1312,7 @@ class Message
             }
             }
         }
         }
         try {
         try {
-            $this->mergeFromJsonArray($array);
+            $this->mergeFromJsonArray($array, $ignore_unknown);
         } catch (\Exception $e) {
         } catch (\Exception $e) {
             throw new GPBDecodeException($e->getMessage());
             throw new GPBDecodeException($e->getMessage());
         }
         }

+ 5 - 0
php/tests/encode_decode_test.php

@@ -884,6 +884,11 @@ class EncodeDecodeTest extends TestBase
         $m->mergeFromJsonString("{\"unknown\":{\"a\":1, \"b\":1},
         $m->mergeFromJsonString("{\"unknown\":{\"a\":1, \"b\":1},
                                 \"optionalInt32\":1}", true);
                                 \"optionalInt32\":1}", true);
         $this->assertSame(1, $m->getOptionalInt32());
         $this->assertSame(1, $m->getOptionalInt32());
+
+        // Test unknown enum value
+        $m = new TestMessage();
+        $m->mergeFromJsonString("{\"optionalEnum\":\"UNKNOWN\"}", true);
+        $this->assertSame(0, $m->getOptionalEnum());
     }
     }
 
 
     public function testJsonEncode()
     public function testJsonEncode()

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác