【问题标题】:How can I deserialize JSON containing delimited JSON?如何反序列化包含分隔 JSON 的 JSON?
【发布时间】:2014-03-14 16:19:13
【问题描述】:

我在将 Json 字符串反序列化为对象时遇到问题。

这是我从网络服务收到的示例 json:

{
    "GetDataResult":
                 "{
                     \"id\":1234,
                     \"cityname\":\"New York\",
                     \"temperature\":300,
                  }"
}

我有一个像这样的类 CityData

[JsonObject("GetDataResult")]
public class CityData
{
    [JsonProperty("id")]
    public int Id { get; set; }

    [JsonProperty("cityname")]
    public string CityName { get; set; }

    [JsonProperty("temperature")]
    public int Temperature { get; set; }
}

我尝试通过调用 DeserializeObject 方法来反序列化 json

var cityData = JsonConvert.DeserializeObject<CityData>(response);

但根元素似乎有问题......

你们知道我该如何解决它,以便我收到一个填写了数据的 CityData 对象吗?

【问题讨论】:

  • 什么是response? JSON 中 GetDataResult 属性的值是一个字符串,因此不会以您期望的方式反序列化为属性。
  • Web 服务正在吐出错误的 JSON。这在技术上是合法的,但显然不是你想要的。那里的转义字符串引号......这一切都很糟糕。
  • 他可能正在使用 WCF 可怕的 JSON“包装”,或者类似的东西。

标签: c# json.net


【解决方案1】:

json 响应包含一个对象,该对象本身包含一个表示数据结果的 json 字符串。

您需要反序列化两次,一次用于响应,一次用于数据结果。

var response = JsonConvert.DeserializeObject<JObject>(responseStr);
var dataResult = (string)response["GetDataResult"];
var cityData = JsonConvert.DeserializeObject<CityData>(dataResult);

【讨论】:

  • 如果你写自定义JsonConverter并使用LINQ to JSON,你可以避免反序列化两次。
  • 当然可以,但是你必须编写转换器。这将是最简单的解决方案,至少在他需要更强大的解决方案之前是这样。
  • 转换为字符串会引发错误。我用 ToString() 代替
  • @RomanGudkov,显然您的数据不是字符串,它可能已经是一个对象。只需转换为 JObject 或任何适当的类型。如果非必要,重新解析它是没有意义的。
猜你喜欢
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
相关资源
最近更新 更多