Newtonsoft JsonSerializer - 小写属性和字典

时间:2015-12-03 15:55:48

标签: c# json.net

我正在使用json.net(Newtonsoft' JsonSerializer)。我需要自定义序列化以满足以下要求:

  1. 属性名称必须以小写字母开头。
  2. 必须将字典序列化为jsonp,其中键将用于属性名称。 LowerCase规则不适用于字典键。
  3. 例如:

    {
      name: "Product1",
      items : {
        "Item1": {
           description : "Lorem Ipsum"
        }
      }
    }
    

    必须序列化为:

    public class CustomJsonWriter : JsonTextWriter
    {
        public CustomJsonWriter(TextWriter writer) : base(writer)
        {
    
        }
        public override void WritePropertyName(string name, bool escape)
        {
            if (name != "$type")
            {
                name = name.ToCamelCase();
            }
            base.WritePropertyName(name, escape);
        }
    }
    

    注意属性Name序列化为" name",但是键Item1序列化为" Item1&#34 ;;

    我尝试创建CustomJsonWriter来序列化属性名称,但它也会更改dicionary键。

    viewDidLayoutSubviews

2 个答案:

答案 0 :(得分:87)

您可以尝试使用CamelCasePropertyNamesContractResolver

var serializerSettings = new JsonSerializerSettings();
serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
var json = JsonConvert.SerializeObject(product, serializerSettings);

我只是不确定它是如何处理字典键的,而我没有时间在第二次尝试它。如果它没有正确处理密钥,那么对于未来仍然值得记住,而不是编写自己的自定义JSON编写器。

答案 1 :(得分:34)

您可以使用JsonProperty来更改某些内容的序列化/反序列化。定义对象时,将属性项添加到要在JSON中以不同方式表示的字段中。这仅适用于NewtonsoftJSON。其他图书馆也可能采用不同的方式。

// workaround to use threaded cuda context mode
Alea.CUDA.Settings.Instance.Worker.DefaultContextType <- "threaded"
// compile GPU code and keep the module live for a long time
use reduceModule = new DeviceReduceModule<float32>(GPUModuleTarget.Worker(worker),<@ (+) @>)
// now get a reducer from reduce module.
// this reduce object includes some temp memories for algorithm
use reducer = reduceModule.Create(maxReduceNumber)
reducer.Reduce(....)