{"record":{"id":"06600c83bbfee87c","repo":"XINCGer/Unity3DTraining","slug":"value-message-must-contain-a-value-for-the-oneof","errorCode":null,"errorMessage":"Value message must contain a value for the oneof.","messagePattern":"Value message must contain a value for the oneof\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"NetWorkAndResources/Socket_Protobuff/Assets/Plugins/Google.Protobuf/JsonFormatter.cs","lineNumber":596,"sourceCode":"\n                if (!first)\n                {\n                    writer.Write(PropertySeparator);\n                }\n                WriteString(writer, key);\n                writer.Write(NameValueSeparator);\n                WriteStructFieldValue(writer, value);\n                first = false;\n            }\n            writer.Write(first ? \"}\" : \" }\");\n        }\n\n        private void WriteStructFieldValue(TextWriter writer, IMessage message)\n        {\n            var specifiedField = message.Descriptor.Oneofs[0].Accessor.GetCaseFieldDescriptor(message);\n            if (specifiedField == null)\n            {\n                throw new InvalidOperationException(\"Value message must contain a value for the oneof.\");\n            }\n\n            object value = specifiedField.Accessor.GetValue(message);\n\n            switch (specifiedField.FieldNumber)\n            {\n                case Value.BoolValueFieldNumber:\n                case Value.StringValueFieldNumber:\n                case Value.NumberValueFieldNumber:\n                    WriteValue(writer, value);\n                    return;\n                case Value.StructValueFieldNumber:\n                case Value.ListValueFieldNumber:\n                    // Structs and ListValues are nested messages, and already well-known types.\n                    var nestedMessage = (IMessage)specifiedField.Accessor.GetValue(message);\n                    WriteWellKnownTypeValue(writer, nestedMessage.Descriptor, nestedMessage);\n                    return;\n                case Value.NullValueFieldNumber:","sourceCodeStart":578,"sourceCodeEnd":614,"githubUrl":"https://github.com/XINCGer/Unity3DTraining/blob/016f98412ea5e11756b286736f479b66ab6216d5/NetWorkAndResources/Socket_Protobuff/Assets/Plugins/Google.Protobuf/JsonFormatter.cs#L578-L614","documentation":"JsonFormatter.WriteStructFieldValue throws InvalidOperationException when a google.protobuf.Value message has no case set in its oneof (kind). A Value must have exactly one of null_value/number_value/string_value/bool_value/struct_value/list_value set.","triggerScenarios":"Formatting a Value constructed with new Value() and never assigned any kind; calling ClearKind(); deserializing an empty/zero-length Value message and then formatting it.","commonSituations":"Default-initialized Value fields in hand-built messages; a Struct whose map values are empty Value instances; partial deserialization of truncated data.","solutions":["Set exactly one kind before formatting, e.g. Value.ForNull(), Value.ForString(\"x\")","Check Value.HasKind / which case is set before formatting","Avoid default(Value) instances; use the static For* factory methods","Validate Struct contents recursively before JsonFormatter.Format"],"exampleFix":"// before\nvar v = new Value();\n// after\nvar v = Value.ForNull(); // or Value.ForString(\"text\")","handlingStrategy":"validation","validationCode":"if (!value.HasKind) { value = Value.ForNull(); } // or appropriate kind\nformatter.Format(structMsg);","typeGuard":"static bool HasKind(Value v) => v.KindCase != Value.KindOneofCase.None;","tryCatchPattern":"try { json = formatter.Format(msg); } catch (InvalidOperationException ex) when (ex.Message.Contains(\"oneof\")) { /* fill default kind and retry */ }","preventionTips":["Construct Values only via Value.For* factory methods","Check KindCase != None before formatting","Never persist or format default-initialized Value messages"],"tags":["csharp","protobuf","json","struct"],"backgroundTag":"empty-required-field","analyzedSha":"016f98412ea5e11756b286736f479b66ab6216d5","analyzedAt":"2026-09-12T01:08:58.711Z","contentChangedAt":"2026-09-12T01:08:58.711Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}