Issue serializing List<KeyValuePair<string,string>> in camelCase
reddyrajanala opened this issue · 1 comments
reddyrajanala commented
//I am unable to serialize List<KVP<string,string>> with kvp names as "key"/"value"
//similarly cannot deserialize
//See the snippet below
`
using System;
using Utf8Json;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Utf8Json.Resolvers;
using Utf8Json.Formatters;
public class Program
{
public static void Main()
{
CompositeResolver.RegisterAndSetAsDefault(
new IJsonFormatter[] {new KeyValuePairFormatter<string, string>()}, //this did not help
new[] {StandardResolver.CamelCase});
var p = new Person{
FirstName = "Bob",
LastName ="Smith",
Others = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("foo1", "bar1"),
new KeyValuePair<string, string>("foo2", "bar2"),
new KeyValuePair<string, string>("foo3", "bar3"),
}
};
var utf8SerializedJson = Utf8Json.JsonSerializer.ToJsonString(p, Utf8Json.Resolvers.StandardResolver.CamelCase);
Console.WriteLine(utf8SerializedJson);
//ouptput : note "Key" and "Value" names are not in camelcase
//{"firstName":"Bob","lastName":"Smith","others":[{"**Key**":"foo1","**Value**":"bar1"},{"Key":"foo2","Value":"bar2"},{"Key":"foo3","Value":"bar3"}]}
var newtonSoftSerializedJson = Newtonsoft.Json.JsonConvert.SerializeObject(p, new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
});
Console.WriteLine(newtonSoftSerializedJson);
//output : note "key" and "value" are in camelcase
//{"firstName":"Bob","lastName":"Smith","others":[{"key":"foo1","value":"bar1"},{"key":"foo2","value":"bar2"},{"key":"foo3","value":"bar3"}]}
//key and value as "Key" and "Value" - desierializes as expected
var ds1 = @"{""firstName"":""Sri"",""lastName"":""Raj"",""others"":[{""Key"":""foo1"",""Value"":""bar1""},{""Key"":""foo2"",""Value"":""bar2""},{""Key"":""foo3"",""Value"":""bar3""}]}";
var person1 = Utf8Json.JsonSerializer.Deserialize<Person>(ds1);
Console.WriteLine(person1.Others.First().Key + "-" + person1.Others.First().Value );
//key and value as "key" and "value" - fails to deseiralize as expected
var ds2 = @"{""firstName"":""Sri"",""lastName"":""Raj"",""others"":[{""key"":""foo1"",""value"":""bar1""},{""key"":""foo2"",""value"":""bar2""},{""key"":""foo3"",""value"":""bar3""}]}";
var person2 = Utf8Json.JsonSerializer.Deserialize<Person>(ds2);
//expected: "foo1 - bar1" actual: " - "
Console.WriteLine(person2.Others.First().Key + "-" + person2.Others.First().Value );
}
public class Person
{
public string FirstName{get;set;}
public string LastName{get;set;}
public List<KeyValuePair<string, string>> Others {get;set;}
}
}
`
bokmadsen commented
I've looking for the same solution, but it's not easy. It would require a modification of the code because it's hardcoded to instantiate the builtin KeyValueFormatter here :
I don't think a PR would be enough, as it seems the project is abandoned