JSON.NET反序列化 - 转换值时出错

时间:2014-04-18 16:34:43

标签: asp.net-mvc-4 fabricjs json-deserialization

我有这个JSON对象(FabricJS),我想在POST请求中使用JSON.NET反序列化:

"{\"objects\":[{\"type\":\"OpenLayout\",\"originX\":\"left\",\"originY\":\"top\",\"left\":300,\"top\":203,\"width\":200,\"height\":100,\"fill\":\"#f05a30\",\"stroke\":null,\"strokeWidth\":1,\"strokeDashArray\":null,\"strokeLineCap\":\"butt\",\"strokeLineJoin\":\"miter\",\"strokeMiterLimit\":10,\"scaleX\":1,\"scaleY\":1,\"angle\":0,\"flipX\":false,\"flipY\":false,\"opacity\":1,\"shadow\":null,\"visible\":true,\"clipTo\":null,\"backgroundColor\":\"\",\"rx\":0,\"ry\":0,\"x\":0,\"y\":0,\"label\":\"btn1\"},{\"type\":\"OpenLayout\",\"originX\":\"left\",\"originY\":\"top\",\"left\":13,\"top\":335,\"width\":200,\"height\":100,\"fill\":\"#f05a30\",\"stroke\":null,\"strokeWidth\":1,\"strokeDashArray\":null,\"strokeLineCap\":\"butt\",\"strokeLineJoin\":\"miter\",\"strokeMiterLimit\":10,\"scaleX\":1,\"scaleY\":1,\"angle\":0,\"flipX\":false,\"flipY\":false,\"opacity\":1,\"shadow\":null,\"visible\":true,\"clipTo\":null,\"backgroundColor\":\"\",\"rx\":0,\"ry\":0,\"x\":0,\"y\":0,\"label\":\"\"}],\"background\":\"\"}"

这是表示结构的类:

public partial class ControlPageResponse
{

    [JsonProperty("objects")]
    public CanvasBtns[] Btns { get; set; }

    [JsonProperty("background")]
    public string Background { get; set; }
}

public class CanvasBtns
{

    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("originX")]
    public string OriginX { get; set; }

    [JsonProperty("originY")]
    public string OriginY { get; set; }

    [JsonProperty("left")]
    public int Left { get; set; }

    [JsonProperty("top")]
    public int Top { get; set; }

    [JsonProperty("width")]
    public int Width { get; set; }

    [JsonProperty("height")]
    public int Height { get; set; }

    [JsonProperty("fill")]
    public string Fill { get; set; }

    [JsonProperty("stroke")]
    public object Stroke { get; set; }

    [JsonProperty("strokeWidth")]
    public int StrokeWidth { get; set; }

    [JsonProperty("strokeDashArray")]
    public object StrokeDashArray { get; set; }

    [JsonProperty("strokeLineCap")]
    public string StrokeLineCap { get; set; }

    [JsonProperty("strokeLineJoin")]
    public string StrokeLineJoin { get; set; }

    [JsonProperty("strokeMiterLimit")]
    public int StrokeMiterLimit { get; set; }

    [JsonProperty("scaleX")]
    public int ScaleX { get; set; }

    [JsonProperty("scaleY")]
    public int ScaleY { get; set; }

    [JsonProperty("angle")]
    public int Angle { get; set; }

    [JsonProperty("flipX")]
    public bool FlipX { get; set; }

    [JsonProperty("flipY")]
    public bool FlipY { get; set; }

    [JsonProperty("opacity")]
    public int Opacity { get; set; }

    [JsonProperty("shadow")]
    public object Shadow { get; set; }

    [JsonProperty("visible")]
    public bool Visible { get; set; }

    [JsonProperty("clipTo")]
    public object ClipTo { get; set; }

    [JsonProperty("backgroundColor")]
    public string BackgroundColor { get; set; }

    [JsonProperty("rx")]
    public int Rx { get; set; }

    [JsonProperty("ry")]
    public int Ry { get; set; }

    [JsonProperty("x")]
    public int X { get; set; }

    [JsonProperty("y")]
    public int Y { get; set; }

    [JsonProperty("label")]
    public string Label { get; set; }
}

}

当我尝试反序列化时,我得到“Newtonsoft.Json.dll [...]出现类型'Newtonsoft.Json.JsonSerializationException'的第一次机会异常[...]错误转换值[...]'ControlPageDesigner。 General.ControlPageResponse'.Path'“。我似乎无法找到问题。

ControlPageResponse controlPageRecord = JsonConvert.DeserializeObject<ControlPageResponse>(ControlPage);

2 个答案:

答案 0 :(得分:0)

我不确定我的后续猜测,因为我没有在ASP.NET中使用fabricjs 但是如果使用javascript序列化fabric.canvas对象,它与其他javascript对象不同,因为在框架中 toJSON-Method被覆盖。 如果调用toJSON,则fabirc.canvas对象仅返回表示其内容的对象。序列化此返回的对象后,您将获得画布内容的json表示。不是画布对象本身。 对于反序列化,您必须使用特殊方法( loadFromJSON )。

我认为使用ASP.NET的行为是一样的。

答案 1 :(得分:0)

我遇到了一个非常类似的问题,发现我需要在我的JSON对象中声明一个空构造函数。否则,反序列化器将尝试使用我的其他构造函数并给出上述错误。