Allow the original field name (rather than camel-cased) when parsing JSON
This commit is contained in:
parent
1fc485928f
commit
022a9b2675
@ -71,6 +71,14 @@ namespace Google.Protobuf
|
|||||||
Assert.Throws<InvalidProtocolBufferException>(() => JsonParser.Default.Parse<TestMap>(json));
|
Assert.Throws<InvalidProtocolBufferException>(() => JsonParser.Default.Parse<TestMap>(json));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void OriginalFieldNameAccepted()
|
||||||
|
{
|
||||||
|
var json = "{ \"single_int32\": 10 }";
|
||||||
|
var expected = new TestAllTypes { SingleInt32 = 10 };
|
||||||
|
Assert.AreEqual(expected, TestAllTypes.Parser.ParseJson(json));
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void SourceContextRoundtrip()
|
public void SourceContextRoundtrip()
|
||||||
{
|
{
|
||||||
|
@ -92,11 +92,22 @@ namespace Google.Protobuf.Reflection
|
|||||||
new FieldDescriptor(field, file, this, index, generatedCodeInfo?.PropertyNames[index]));
|
new FieldDescriptor(field, file, this, index, generatedCodeInfo?.PropertyNames[index]));
|
||||||
fieldsInNumberOrder = new ReadOnlyCollection<FieldDescriptor>(fieldsInDeclarationOrder.OrderBy(field => field.FieldNumber).ToArray());
|
fieldsInNumberOrder = new ReadOnlyCollection<FieldDescriptor>(fieldsInDeclarationOrder.OrderBy(field => field.FieldNumber).ToArray());
|
||||||
// TODO: Use field => field.Proto.JsonName when we're confident it's appropriate. (And then use it in the formatter, too.)
|
// TODO: Use field => field.Proto.JsonName when we're confident it's appropriate. (And then use it in the formatter, too.)
|
||||||
jsonFieldMap = new ReadOnlyDictionary<string, FieldDescriptor>(fieldsInNumberOrder.ToDictionary(field => JsonFormatter.ToCamelCase(field.Name)));
|
jsonFieldMap = CreateJsonFieldMap(fieldsInNumberOrder);
|
||||||
file.DescriptorPool.AddSymbol(this);
|
file.DescriptorPool.AddSymbol(this);
|
||||||
Fields = new FieldCollection(this);
|
Fields = new FieldCollection(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static ReadOnlyDictionary<string, FieldDescriptor> CreateJsonFieldMap(IList<FieldDescriptor> fields)
|
||||||
|
{
|
||||||
|
var map = new Dictionary<string, FieldDescriptor>();
|
||||||
|
foreach (var field in fields)
|
||||||
|
{
|
||||||
|
map[JsonFormatter.ToCamelCase(field.Name)] = field;
|
||||||
|
map[field.Name] = field;
|
||||||
|
}
|
||||||
|
return new ReadOnlyDictionary<string, FieldDescriptor>(map);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The brief name of the descriptor's target.
|
/// The brief name of the descriptor's target.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -255,9 +266,10 @@ namespace Google.Protobuf.Reflection
|
|||||||
// TODO: consider making this public in the future. (Being conservative for now...)
|
// TODO: consider making this public in the future. (Being conservative for now...)
|
||||||
|
|
||||||
/// <value>
|
/// <value>
|
||||||
/// Returns a read-only dictionary mapping the field names in this message as they're used
|
/// Returns a read-only dictionary mapping the field names in this message as they're available
|
||||||
/// in the JSON representation to the field descriptors. For example, a field <c>foo_bar</c>
|
/// in the JSON representation to the field descriptors. For example, a field <c>foo_bar</c>
|
||||||
/// in the message would result in an entry with a key <c>fooBar</c>.
|
/// in the message would result two entries, one with a key <c>fooBar</c> and one with a key
|
||||||
|
/// <c>foo_bar</c>, both referring to the same field.
|
||||||
/// </value>
|
/// </value>
|
||||||
internal IDictionary<string, FieldDescriptor> ByJsonName() => messageDescriptor.jsonFieldMap;
|
internal IDictionary<string, FieldDescriptor> ByJsonName() => messageDescriptor.jsonFieldMap;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user