【问题标题】:Json arry and other properties deserialization (C#)Json 数组和其他属性反序列化(C#)
【发布时间】:2017-11-03 16:06:34
【问题描述】:

我有以下包含未命名数组和其他命名属性的 json。我想知道如何使用 Newtonsoft.Json 将其反序列化为一个类。

  { 
    "message": "success",
    [
        {
            "timestamp": 1509723862,
            "tid": 84823616,
            "price": "7344.7",
            "amount": "0.36108123",
            "exchange": "bitfinex",
            "type": "sell"
        },
        {
           ...
        }
    ]
  }

我知道我可以使用反序列化数组 serializer.DeserializeObjectList >(serializedObject),但由于json包含其他属性,所以不是json-array字符串。

在下面的类中,我是否可以使用任何配置来告诉 Newtonsoft.Json 将数组反序列化为列表,并将“消息”属性反序列化为字符串:

public class Response
{
   public string Message {get;set;}
   public List<ResponseItem> ResponseItems {get;set;}

}

public class ResponseItem {
  string timestamp {get;set;}
  (...)
}

【问题讨论】:

  • 你为什么要解析无效的 JSON?你不能解决它吗?
  • 我想我误解了这个问题。实际上,它总是给我一个有效的 json。如果我问api.bitfinex.com/v1/trades/BTCUSD,它会返回一个有效的 json 数组。如果我请求api.bitfinex.com/v1/trades/BTCUSDxxx,它会再次给我一个有效的 json,但这次是不同的。我想要做的是只有一个类(包含两个响应)。不确定是否可行。
  • 那个json 无效的,把它放到jsonlint.com 就可以看到了。您不能反序列化无效的 json。您的第一步应该是更正 json

标签: c# json serialization


【解决方案1】:

JSON 不能在同一级别上同时具有未命名数组和命名值。 JSON 无效。要么一切都是有键的,要么是一个无键的数组。不能两者兼得。

【讨论】:

    【解决方案2】:

    我认为连接两个 Json 不是一个好主意。 使用您自己的反序列化器并传递您的两个 Json:

    public static class ResponseDeserializer
    {
        public static Response Deserialize(string psMessage, string psResponeItems)
        {
            dynamic loMessage = JsonConvert.DeserializeObject(psMessage);
    
            return new Response()
            {
                Message = loMessage.message,
                ResponseItems = JsonConvert.DeserializeObject<List<ResponseItem>>(psResponeItems)
            };
        }
    }
    

    并使用它:

    string lsMessage = "{\"message\":\"Unknown symbol\"}";
    string lsResponseItems = "[{\"timestamp\":1509726632,\"tid\":84840931,\"price\":\"7298.8\",\"amount\":\"0.0044733\",\"exchange\":\"bitfinex\",\"type\":\"sell\"},{\"timestamp\":1509726630,\"tid\":84840921,\"price\":\"7297.3\",\"amount\":\"0.11550649\",\"exchange\":\"bitfinex\",\"type\":\"sell\"},{\"timestamp\":1509726630,\"tid\":84840911,\"price\":\"7297.2\",\"amount\":\"0.0214149\",\"exchange\":\"bitfinex\",\"type\":\"buy\"},{\"timestamp\":1509726629,\"tid\":84840909,\"price\":\"7297.2\",\"amount\":\"0.41004892\",\"exchange\":\"bitfinex\",\"type\":\"buy\"}]";
    
    var loResponse = ResponseDeserializer.Deserialize(lsMessage, lsResponseItems);
    Console.WriteLine(loResponse.Message);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-08
      • 2017-01-18
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      相关资源
      最近更新 更多