【问题标题】:Parse json in c# when each name/value pair isn't sent未发送每个名称/值对时在 c# 中解析 json
【发布时间】:2018-02-15 17:45:33
【问题描述】:

我正在平板电脑和 PC 之间实现客户端/服务器,我需要来回传递数据。在做了一些阅读 json 之后,它看起来可能是一个简单的、定义好的接口来使用。我在我的项目中使用 Newtonsoft.Json。

我的理解是,除非在架构中按要求定义,否则每个名称/值对不必在每条消息中。如果这是真的,我正在努力解决如何在反序列化 json 对象以确定消息中发送的名称之后解析它。

例如,如果我正在发送天气数据并且可以发送看起来像这样的 json 数据

{  "isRaining": false,
   "isSnowing": false,
   "temp": 50.0
}

如果我总是发送所有三个,那么我可以创建一个具有相同成员的类并在我反序列化时分配数据。

public class Weather
{
    public bool isRaining { get; set; }
    public bool isSnowing { get; set; }
    public float temp { get; set; }
}

Weather readWeather = JsonConvert.DeserializeObject<Weather>(data);

但我不想每次传输都发送所有数据。我真的只想知道是否发生了变化,然后如果温度上升,则只获取临时名称/值对,如果下雨还是下雪没有改变,我不想获取该数据。

看起来至少以这种方式反序列化数据,我无法为每个循环执行一次以查看存在哪些名称。有没有办法做到这一点?还是我一直卡在发送所有数据?

我会在我的实际实现中发送更多数据,为了简单起见,我在这里只放了三对。

【问题讨论】:

    标签: c# json


    【解决方案1】:

    如果你让你的属性可以为空,发送它们是可选的

    public class Weather
    {        
        public bool? isRaining { get; set; }
        public bool? isSnowing { get; set; }
        public float? temp { get; set; }
    }
    

    这会很高兴地接受这个 json:

    {  
       "isSnowing": false,
       "temp": 50.0
    }
    

    你可以用HasValue测试结果

    var hasRainData = readWeather.isRaining.HasData;
    

    现场示例:http://rextester.com/HCZG76360

    【讨论】:

      【解决方案2】:

      您可以使用 Nullable&lt;&gt; 数据类型将属性设为可选:

      public class Weather
      {
          public bool? isRaining { get; set; }
          public bool? isSnowing { get; set; }
          public float? temp { get; set; }
      }
      Weather readWeather = JsonConvert.DeserializeObject<Weather>(data);
      if(readWeather.isRaining != null)
      {
          Console.WriteLine("It is " + (readWeather.isRaining.Value ? "now raining" : "no longer raining"));
      }
      

      【讨论】:

        【解决方案3】:

        您可以使用 JsonReader 进行更多受控的反序列化并找出实际存在的属性 Json.Net Reader official example

        JsonTextReader reader = new JsonTextReader(new StringReader(json));
        while (reader.Read())
        {
            if (reader.Value != null)
            {
                Console.WriteLine("Token: {0}, Value: {1}", reader.TokenType, reader.Value);
            }
            else
            {
                Console.WriteLine("Token: {0}", reader.TokenType);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-11
          • 2021-04-07
          • 1970-01-01
          • 2015-01-20
          • 2021-10-17
          • 1970-01-01
          • 2023-03-25
          相关资源
          最近更新 更多