DeserializeObject<T> 返回具有空/默认值的对象

Jus*_*tin 4 c# json.net

如果我尝试反序列化以下 json

{ "error": "Invalid order request" }
Run Code Online (Sandbox Code Playgroud)

我希望在将其反序列化为完全不同结构的类时会抛出异常

var response = JsonConvert.DeserializeObject<OrderResponse>(errorJson);
Run Code Online (Sandbox Code Playgroud)

但它返回一个具有默认/空值的对象

response.orderNumber == 0;           // true
response.resultingOrders == null;    // true
Run Code Online (Sandbox Code Playgroud)

我的 OrderResponse 类如下:

public class OrderResponse
{
    public long orderNumber;
    public List<Order> resultingOrders;

    [JsonConstructor]
    public OrderResponse(long orderNumber, List<Order> resultingOrders)
    {
        this.orderNumber = orderNumber;
        this.resultingOrders = resultingOrders;
    }
}

public class Order
{
    public long orderId
    public decimal amount;
    public string type;

    [JsonConstructor]
    public Order(long orderId, decimal amount, string type)
    {
        this.orderId = orderId;
        this.amount = amount;
        this.type; = type;
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望反序列化步骤抛出异常或返回空对象。我认为添加 [JsonConstructor] 属性可以解决这个问题,但这里没有骰子。

难道我做错了什么?我需要创建自己的 JsonConverter 还是可以修改其他一些反序列化器设置?

Nat*_*gge 7

要抛出异常,您必须更改默认的序列化设置。默认情况下,当类中缺少 Json 的成员时,Json.NET 会忽略:

MissingMemberHandling– 默认情况下,此属性设置为 Ignore,这意味着如果 Json 具有目标对象上不存在的属性,它将被忽略。如果 json 包含目标对象类型上不存在的成员,则将此设置为 Error 将导致抛出异常。

代码应该是这样的:

JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
serializerSettings.MissingMemberHandling = MissingMemberHandling.Error;
var response = JsonConvert.DeserializeObject<OrderResponse>(errorJson, serializerSettings);
Run Code Online (Sandbox Code Playgroud)