如何反序列化JSON数据,该数据有时为空数组,有时为字符串值。

4
我从服务器获取JSON数据,但当字符串值为空时,服务器返回一个空数组,而不是一个空字符串("")。因此,我不知道如何处理这种情况,我正在使用JSON.NET来反序列化JSON数据,我是否应该重写JsonConverter中的ReadJson方法?谢谢大家! 详细描述 由于在WeiboPOI类中,我将Poiid和Address定义为字符串,当服务器返回字符串数据时,我的程序可以正常反序列化JSON数据,但当Poiid或Address为空时,服务器返回一个空数组,而不是空字符串(""),因此我的程序无法反序列化JSON数据。 JSON数据
{
  "pois": [
    {
      "pid": "P01QN07N6S5",
      "longitude": "109.53466",
      "latitude": "26.96971",
      "name": "TEST1",
      "city_name": "TEST1",
      "province_name": "TEST1",
      "address": [

      ],
      "telephone": "",
      "category": "190108",
      "navigator": "",
      "pic_url": ""
    },
    {
      "pid": [

      ],
      "longitude": "113.32608",
      "latitude": "23.15884",
      "name": "TEST2",
      "city_name": "TEST2",
      "province_name": "TEST2",
      "address": "Test address",
      "telephone": "020-61089463",
      "category": "60000",
      "navigator": "",
      "pic_url": ""
    }
  ],
  "total_number": "68467"
}

图像

在此输入图片描述

数据传输对象 (DTO)

public class WeiboPOI : IWeiboModel
{
[DataMember]
public string Poiid { get; set; }

[DataMember]
public string Title { get; set; }

// This is a string value not array.
// So the server returns an empty array will have an exception.
[DataMember]
public string Address { get; set; }

[JsonProperty("lon")]
public string Longitude { get; set; }

[JsonProperty("Lat")]
public string Latitude { get; set; }

[DataMember]
public string Category { get; set; }

[DataMember]
public string City { get; set; }

[DataMember]
public string Province { get; set; }

[DataMember]
public string Country { get; set; }

[DataMember]
public string Url { get; set; }

[DataMember]
public string Phone { get; set; }

[DataMember]
public string Postcode { get; set; }

[DataMember]
public string WeiboId { get; set; }

[DataMember]
public string Icon { get; set; }

[DataMember]
public string Extra { get; set; }

[DataMember]
public string Rid { get; set; }

[DataMember]
public string Categorys { get; set; }

[DataMember]
public string CategoryName { get; set; }

[DataMember]
public string CheckinUserNum { get; set; }

[DataMember]
public string PoiPic { get; set; }

[DataMember]
public int Pintu { get; set; }

[DataMember]
public string PoiStreetAddress { get; set; }

[DataMember]
public string PoiStreetSummary { get; set; }

[DataMember]
public int Enterprise { get; set; }

[DataMember]
public string CheckinTime { get; set; }

public string RawSource { get; set; }
}

你好。我认为我没有正确理解你的问题。如果你的数组是空的,那么没有返回数据。这有什么问题吗? - Jhonatas Kleinkauff
1
你能否贴出你正在使用的C#代码来对这个进行反序列化? - Joe Enos
我对这个问题感到困惑。输入的 JSON 指定了第一个元素的地址和第二个元素的 pid 为空数组 - 你的 JSON 反序列化器正在正确地读取你检索到的数据。看起来服务器组件生成了错误的 JSON。 - wgraham
1
似乎是服务器软件的错误。我会修复它而不是在客户端解决问题。如果您无法修复服务器,您需要实现自定义JsonConverter。有关类似示例,请参见https://dev59.com/qXPYa4cB1Zd3GeqPeAfO#16977074。 - Athari
@Joe Enos,请查看我的详细描述,谢谢。 - JKhuang
显示剩余2条评论
1个回答

2
编写一个自定义的 JsonConverter 以处理原始类型是非常简单的:
using System;
using Newtonsoft.Json;

namespace So17171737_ArrayOrString
{
    class StringOrArrayConverter : JsonConverter
    {
        public override object ReadJson (JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            switch (reader.TokenType) {
                case JsonToken.String:
                case JsonToken.Null:
                    return reader.Value;
                case JsonToken.StartArray:
                    reader.Read();
                    if (reader.TokenType != JsonToken.EndArray)
                        throw new JsonReaderException("Empty array expected.");
                    return "";
            }
            throw new JsonReaderException("Expected string or null or empty array.");
        }

        public override void WriteJson (JsonWriter writer, object value, JsonSerializer serializer)
        {
            serializer.Serialize(writer, value);
        }

        public override bool CanConvert (Type objectType)
        {
            return objectType == typeof(string);
        }
    }

    class Program
    {
        private const string json = @"
{
    s1: 'str1',
    s2: [],
    s3: null
}
";

        static void Main ()
        {
            Foo foo = JsonConvert.DeserializeObject<Foo>(json, new JsonSerializerSettings {
                Converters = { new StringOrArrayConverter() }
            });
            Console.WriteLine(JsonConvert.SerializeObject(foo, Formatting.Indented));
            Console.ReadKey();
        }

        class Foo
        {
            public string s1, s2, s3;
        }
    }
}

这段代码覆盖了所有string值的反序列化。如果你只需要针对特定成员进行操作,那么你需要应用JsonConverterAttribute


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接