Newtonsoft.Json 零碎小技巧记录

嵌套属性选择

            var json =   """                
{
"table_name": "article_texture",
"article_user": {
    "id": 123456, 
    "user_nickname": "trykle"
    }, 
"userId": 456789
}        
""";
           

            var obj = JObject.Parse(json);
            var nickname = obj.SelectToken("article_user.user_nickname");
            var nickname2 = obj.SelectToken("article_user.user_nickname2");
            var result = JsonConvert.DeserializeObject<ProductDetails>(json);
            Console.WriteLine(result.user_nickname);

获取值时忽略key大小写

 var json = """
    {"Name":"trykle"}
    """;

var jobj = JObject.Parse(json);
var val = jobj.GetValue("NAME", StringComparison.OrdinalIgnoreCase);
Console.WriteLine(val);

可以正确转换布尔和数字

    public record Info
    {
        public bool isTrue1 { get; set; } 
        public bool isTrue2 { get; set; } 
        public bool isFalse1 { get; set; } 
        public bool isFalse2 { get; set; } 
    }

    internal class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            var json = """                
{
"isTrue1": true,
"isTrue2": 1,

"isFalse1": false,
"isFalse2": 0
}

                
""";
            var result = JsonConvert.DeserializeObject<Info>(json);
            Console.WriteLine(result);
            Console.Read();
        }

白名单模式,只序列化需要的属性

[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public class Employee 
{
    [JsonProperty]
    public string Department { get; set; }

    [JsonProperty]
    public decimal Salary { get; set; }
}

序列化配置

 var settings = new JsonSerializerSettings
 {
    ContractResolver = new CamelCasePropertyNamesContractResolver(), //小驼峰
    Formatting = Formatting.Indented, //格式化输出
 };
 var json = JsonConvert.SerializeObject(obj, settings);

处理json对象值类型不确定

有很多其他的方式,比较转换器,这里将处理方式限定在类内部

public class MyModel
{
   // 避免序列化时输出,逻辑都在KeyRaws属性中
   [JsonIgnore] 
   public int Key { get; set; }

   // 用于接收原始JSON值的属性
   [JsonProperty("key")]
   private object KeyRaw
   {
      //get用于处理 序列化
      get => Key; 
      //set用于处理 反序列化
      set
      {
         if (value == null)
         {
            Key = -1;
            return;
         }
         var type = value.GetType();
         Console.WriteLine(type);
         //TODO判断输入类型手动转换值
         Key = 2;
      }
   }
}

internal class Program
{
   static void Main(string[] args)
   {
      var json = """
         {"key":"A"}
         """;

      var model = JsonConvert.DeserializeObject<MyModel>(json);
      Console.WriteLine(model.Key);
      model.Key = 999;
      Console.WriteLine("序列化:");
      var settings = new JsonSerializerSettings
      {
         ContractResolver = new CamelCasePropertyNamesContractResolver(), //小驼峰
         Formatting = Formatting.Indented, //格式化输出
      };
      Console.WriteLine(JsonConvert.SerializeObject(model, settings));
   }
}

古法写json字符串

var sw = new StringWriter();
var jw = new Newtonsoft.Json.JsonTextWriter(sw);
jw.Formatting = Formatting.Indented;
jw.WriteStartObject();
{
   jw.WritePropertyName("Info");
   {
      jw.WriteStartObject();
      {
         jw.WritePropertyName("Name");  jw.WriteValue("trykle");
         jw.WritePropertyName("Age"); jw.WriteValue("18");
      }
      jw.WriteEndObject();
   }
   jw.WritePropertyName("Items");
   {
      jw.WriteStartArray();
      {
         for (int i = 0; i < 3; i++)
         {
            jw.WriteStartObject();
            {
               jw.WritePropertyName("ItemIndex");  jw.WriteValue($"{i}");
            }
            jw.WriteEndObject();
         }

      }
      jw.WriteEndArray();
   }
}
jw.WriteEndObject();
Console.WriteLine(sw.GetStringBuilder());

输出

{
  "Info": {
    "Name": "trykle",
    "Age": "18"
  },
  "Items": [
    {
      "ItemIndex": "0"
    },
    {
      "ItemIndex": "1"
    },
    {
      "ItemIndex": "2"
    }
  ]
}

没那么古法的构建json字符串

// 创建 JSON 对象
JObject topObj = new JObject();
topObj["name"] = "张三";
topObj["age"] = 25;
topObj["isStudent"] = false;

// 添加数组
JArray hobbies = ["阅读", "游泳", "编程"];
topObj["hobbies"] = hobbies;

// 添加数组对象
var items = new JArray();
for (int i = 0; i < 2; i++)
{
   JObject item = new JObject();
   item["name"] = $"name-{i}";
   item["index"] = i;
   items.Add(item);
}
topObj["items"] = items;

// 添加嵌套对象
JObject address = new JObject();
address["city"] = "北京";
address["street"] = "朝阳区";
topObj["address"] = address;

string jsonString = topObj.ToString();
Console.WriteLine(jsonString);

输出

{
  "name": "张三",
  "age": 25,
  "isStudent": false,
  "hobbies": [
    "阅读",
    "游泳",
    "编程"
  ],
  "items": [
    {
      "name": "name-0",
      "index": 0
    },
    {
      "name": "name-1",
      "index": 1
    }
  ],
  "address": {
    "city": "北京",
    "street": "朝阳区"
  }

posted @ 2025-03-31 17:02  trykle  阅读(5)  评论(0)    收藏  举报