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": "朝阳区"
}
浙公网安备 33010602011771号