C# 如何配置Json.NET自定义序列化?

C# 如何配置Json.NET自定义序列化?,c#,json.net,C#,Json.net,出于我无法控制的原因,我将从外部服务返回的数据格式化为字符串数组:[[“string\u one”、“string\u two”] 我正在尝试将其反序列化为具有两个属性的对象: public class MyObject { public string PropertyOne { get; set; } public string PropertyTwo { get; set; } } 我使用Json.NET进行所有Json序列化/反序列化。当我尝试转换字符串数组的数组时,我得

出于我无法控制的原因,我将从外部服务返回的数据格式化为字符串数组:
[[“string\u one”、“string\u two”]

我正在尝试将其反序列化为具有两个属性的对象:

public class MyObject
{
    public string PropertyOne { get; set; }
    public string PropertyTwo { get; set; }
}

我使用Json.NET进行所有Json序列化/反序列化。当我尝试转换字符串数组的数组时,我得到一个异常,即JsonArray无法转换为MyObject。实现这一点的适当方式是什么

老实说,我只是将其反序列化为
string[][]
并将其映射到您的域层中。花在自定义序列化上的时间很少值得花。

目标对象和JSON之间存在很大差异。您可以手动执行映射:

string json = "[[\"string_one\", \"string_two\"]]";
dynamic result = JsonConvert.DeserializeObject(json);
var myObject = new MyObject
{
    PropertyOne = result[0][0],
    PropertyTwo = result[0][1]
};

最终使用JsonConverter实现了这个。我将MyObject更改为:

[JsonConverter(typeof(MyObjectConverter))]
public class MyObject
{
    public string PropertyOne { get; set; }
    public string PropertyTwo { get; set; }
}
然后实现MyObjectConverter:

public class MyObjectConverter : JsonConverter
{
    public override object ReadJson (JsonReader reader, Type objectType, Object existingValue, JsonSerializer serializer)
    {
        int pos = 0;
        string[] objectIdParts = new string[2];

        while (reader.Read())
        {
            if (pos < 1)
            {
                if (reader.TokenType == JsonToken.String)
                {
                    objectIdParts[pos] = reader.Value.ToString();
                    pos++;
                }
            }
            // read until the end of the JsonReader
        }

        return new MyObject(objectIdParts);
    }

    public override void WriteJson (JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException ();
    }

    public override bool CanWrite {
        get {
            return base.CanWrite;
        }
    }

    public override bool CanRead { get { return true; } }
    public override bool CanConvert (Type objectType) 
    {
        return true;
    }
}
公共类MyObjectConverter:JsonConverter
{
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
int pos=0;
string[]ObjectdParts=新字符串[2];
while(reader.Read())
{
如果(位置<1)
{
if(reader.TokenType==JsonToken.String)
{
objectdparts[pos]=reader.Value.ToString();
pos++;
}
}
//一直读到JsonReader的末尾
}
返回新的MyObject(ObjectdParts);
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
抛出新的NotImplementedException();
}
公共覆盖布尔可写{
得到{
返回base.CanWrite;
}
}
公共重写bool CanRead{get{return true;}}
公共覆盖布尔CanConvert(类型objectType)
{
返回true;
}
}

遗憾的是,这种差异是不可避免的。我不喜欢这样的答案b/c它不能帮助有这种一般问题的人在将来阅读这个答案…@Henley-幸运的是,有不止一个答案可供选择;)