Skip to content

Commit

Permalink
Migrate from Newtonsoft.Json to System.Text.Json
Browse files Browse the repository at this point in the history
  • Loading branch information
2dust committed Jan 28, 2024
1 parent bd83809 commit 2e30c04
Show file tree
Hide file tree
Showing 7 changed files with 108 additions and 78 deletions.
42 changes: 27 additions & 15 deletions v2rayN/v2rayN/Common/JsonUtils.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.IO;
using System.IO;
using System.Text.Json;
using System.Text.Json.Nodes;
using System.Text.Json.Serialization;

namespace v2rayN
{
Expand Down Expand Up @@ -31,7 +32,7 @@ public static T DeepCopy<T>(T obj)
{
return default;
}
return JsonConvert.DeserializeObject<T>(strJson);
return JsonSerializer.Deserialize<T>(strJson);
}
catch
{
Expand All @@ -44,16 +45,15 @@ public static T DeepCopy<T>(T obj)
/// </summary>
/// <param name="strJson"></param>
/// <returns></returns>
public static JObject? ParseJson(string strJson)
public static JsonNode? ParseJson(string strJson)
{
try
{
if (string.IsNullOrEmpty(strJson))
{
return null;
}

return JObject.Parse(strJson);
return JsonNode.Parse(strJson);
}
catch
{
Expand All @@ -77,9 +77,12 @@ public static string Serialize(object? obj, bool indented = true)
{
return result;
}
result = JsonConvert.SerializeObject(obj,
indented ? Formatting.Indented : Formatting.None,
new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
var options = new JsonSerializerOptions
{
WriteIndented = indented ? true : false,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
};
result = JsonSerializer.Serialize(obj, options);
}
catch (Exception ex)
{
Expand All @@ -88,6 +91,13 @@ public static string Serialize(object? obj, bool indented = true)
return result;
}

/// <summary>
/// SerializeToNode
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static JsonNode? SerializeToNode(object? obj) => JsonSerializer.SerializeToNode(obj);

/// <summary>
/// Save as json file
/// </summary>
Expand All @@ -100,13 +110,15 @@ public static int ToFile(object? obj, string filePath, bool nullValue = true)
int result;
try
{
using StreamWriter file = File.CreateText(filePath);
var serializer = new JsonSerializer()
using FileStream file = File.Create(filePath);

var options = new JsonSerializerOptions
{
Formatting = Formatting.Indented,
NullValueHandling = nullValue ? NullValueHandling.Include : NullValueHandling.Ignore
WriteIndented = true,
DefaultIgnoreCondition = nullValue ? JsonIgnoreCondition.Never : JsonIgnoreCondition.WhenWritingNull
};
serializer.Serialize(file, obj);

JsonSerializer.Serialize(file, obj, options);
result = 0;
}
catch (Exception ex)
Expand Down
31 changes: 31 additions & 0 deletions v2rayN/v2rayN/Common/Utils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -927,6 +927,37 @@ public static bool IsLightTheme()
return value is int i && i > 0;
}

/// <summary>
/// 获取系统hosts
/// </summary>
/// <returns></returns>
public static Dictionary<string, string> GetSystemHosts()
{
var systemHosts = new Dictionary<string, string>();
var hostfile = @"C:\Windows\System32\drivers\etc\hosts";
try
{
if (File.Exists(hostfile))
{
var hosts = File.ReadAllText(hostfile).Replace("\r", "");
var hostsList = hosts.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);

foreach (var host in hostsList)
{
if (host.StartsWith("#")) continue;
var hostItem = host.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
if (hostItem.Length < 2) continue;
systemHosts.Add(hostItem[1], hostItem[0]);
}
}
}
catch (Exception ex)
{
Logging.SaveLog(ex.Message, ex);
}
return systemHosts;
}

#endregion 杂项

#region TempPath
Expand Down
2 changes: 1 addition & 1 deletion v2rayN/v2rayN/Handler/CoreConfigSingbox.cs
Original file line number Diff line number Diff line change
Expand Up @@ -675,7 +675,7 @@ private int GenRoutingUserRule(RulesItem item, List<Rule4Sbox> rules)

private void ParseV2Domain(string domain, Rule4Sbox rule)
{
if (domain.StartsWith("ext:") || domain.StartsWith("ext-domain:"))
if (domain.StartsWith("#") || domain.StartsWith("ext:") || domain.StartsWith("ext-domain:"))
{
return;
}
Expand Down
45 changes: 16 additions & 29 deletions v2rayN/v2rayN/Handler/CoreConfigV2ray.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using Newtonsoft.Json.Linq;
using System.IO;
using System.Net;
using System.Net;
using System.Net.NetworkInformation;
using v2rayN.Mode;
using v2rayN.Resx;
Expand Down Expand Up @@ -721,46 +719,35 @@ private int GenDns(V2rayConfig v2rayConfig)
outbound.settings.userLevel = 0;
}

var obj = JsonUtils.ParseJson(normalDNS) ?? [];

if (!obj.ContainsKey("servers"))
var obj = JsonUtils.ParseJson(normalDNS);
if (obj is null)
{
List<string> servers = [];
string[] arrDNS = normalDNS.Split(',');
foreach (string str in arrDNS)
{
servers.Add(str);
}
obj["servers"] = JArray.FromObject(servers);
obj = JsonUtils.ParseJson("{}");
obj["servers"] = JsonUtils.SerializeToNode(servers);
}

// 追加至 dns 设置
if (item.useSystemHosts)
{
var hostfile = @"C:\Windows\System32\drivers\etc\hosts";

if (File.Exists(hostfile))
var systemHosts = Utils.GetSystemHosts();
if (systemHosts.Count > 0)
{
var hosts = File.ReadAllText(hostfile).Replace("\r", "");
var hostsList = hosts.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);

// 获取系统hosts
var systemHosts = new Dictionary<string, string>();
foreach (var host in hostsList)
{
if (host.StartsWith("#")) continue;
var hostItem = host.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
if (hostItem.Length < 2) continue;
systemHosts.Add(hostItem[1], hostItem[0]);
}

// 追加至 dns 设置
var normalHost = obj["hosts"] ?? new JObject();
foreach (var host in systemHosts)
var normalHost = obj["hosts"];
if (normalHost != null)
{
if (normalHost[host.Key] != null) continue;
normalHost[host.Key] = host.Value;
foreach (var host in systemHosts)
{
if (normalHost[host.Key] != null)
continue;
normalHost[host.Key] = host.Value;
}
}
obj["hosts"] = normalHost;
}
}

Expand Down
60 changes: 30 additions & 30 deletions v2rayN/v2rayN/Mode/GitHubRelease.cs
Original file line number Diff line number Diff line change
@@ -1,68 +1,68 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;

namespace v2rayN.Mode
{
public class GitHubReleaseAsset
{
[JsonProperty("url")] public string Url { get; set; }
[JsonPropertyName("url")] public string Url { get; set; }

[JsonProperty("id")] public int Id { get; set; }
[JsonPropertyName("id")] public int Id { get; set; }

[JsonProperty("node_id")] public string NodeId { get; set; }
[JsonPropertyName("node_id")] public string NodeId { get; set; }

[JsonProperty("name")] public string Name { get; set; }
[JsonPropertyName("name")] public string Name { get; set; }

[JsonProperty("label")] public object Label { get; set; }
[JsonPropertyName("label")] public object Label { get; set; }

[JsonProperty("content_type")] public string ContentType { get; set; }
[JsonPropertyName("content_type")] public string ContentType { get; set; }

[JsonProperty("state")] public string State { get; set; }
[JsonPropertyName("state")] public string State { get; set; }

[JsonProperty("size")] public int Size { get; set; }
[JsonPropertyName("size")] public int Size { get; set; }

[JsonProperty("download_count")] public int DownloadCount { get; set; }
[JsonPropertyName("download_count")] public int DownloadCount { get; set; }

[JsonProperty("created_at")] public DateTime CreatedAt { get; set; }
[JsonPropertyName("created_at")] public DateTime CreatedAt { get; set; }

[JsonProperty("updated_at")] public DateTime UpdatedAt { get; set; }
[JsonPropertyName("updated_at")] public DateTime UpdatedAt { get; set; }

[JsonProperty("browser_download_url")] public string BrowserDownloadUrl { get; set; }
[JsonPropertyName("browser_download_url")] public string BrowserDownloadUrl { get; set; }
}

public class GitHubRelease
{
[JsonProperty("url")] public string Url { get; set; }
[JsonPropertyName("url")] public string Url { get; set; }

[JsonProperty("assets_url")] public string AssetsUrl { get; set; }
[JsonPropertyName("assets_url")] public string AssetsUrl { get; set; }

[JsonProperty("upload_url")] public string UploadUrl { get; set; }
[JsonPropertyName("upload_url")] public string UploadUrl { get; set; }

[JsonProperty("html_url")] public string HtmlUrl { get; set; }
[JsonPropertyName("html_url")] public string HtmlUrl { get; set; }

[JsonProperty("id")] public int Id { get; set; }
[JsonPropertyName("id")] public int Id { get; set; }

[JsonProperty("node_id")] public string NodeId { get; set; }
[JsonPropertyName("node_id")] public string NodeId { get; set; }

[JsonProperty("tag_name")] public string TagName { get; set; }
[JsonPropertyName("tag_name")] public string TagName { get; set; }

[JsonProperty("target_commitish")] public string TargetCommitish { get; set; }
[JsonPropertyName("target_commitish")] public string TargetCommitish { get; set; }

[JsonProperty("name")] public string Name { get; set; }
[JsonPropertyName("name")] public string Name { get; set; }

[JsonProperty("draft")] public bool Draft { get; set; }
[JsonPropertyName("draft")] public bool Draft { get; set; }

[JsonProperty("prerelease")] public bool Prerelease { get; set; }
[JsonPropertyName("prerelease")] public bool Prerelease { get; set; }

[JsonProperty("created_at")] public DateTime CreatedAt { get; set; }
[JsonPropertyName("created_at")] public DateTime CreatedAt { get; set; }

[JsonProperty("published_at")] public DateTime PublishedAt { get; set; }
[JsonPropertyName("published_at")] public DateTime PublishedAt { get; set; }

[JsonProperty("assets")] public List<GitHubReleaseAsset> Assets { get; set; }
[JsonPropertyName("assets")] public List<GitHubReleaseAsset> Assets { get; set; }

[JsonProperty("tarball_url")] public string TarballUrl { get; set; }
[JsonPropertyName("tarball_url")] public string TarballUrl { get; set; }

[JsonProperty("zipball_url")] public string ZipballUrl { get; set; }
[JsonPropertyName("zipball_url")] public string ZipballUrl { get; set; }

[JsonProperty("body")] public string Body { get; set; }
[JsonPropertyName("body")] public string Body { get; set; }
}
}
4 changes: 2 additions & 2 deletions v2rayN/v2rayN/Mode/V2rayConfig.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;

namespace v2rayN.Mode
{
Expand Down Expand Up @@ -580,7 +580,7 @@ public class Headers4Ray
/// <summary>
/// 用户代理
/// </summary>
[JsonProperty("User-Agent")]
[JsonPropertyName("User-Agent")]
public string UserAgent { get; set; }
}

Expand Down
2 changes: 1 addition & 1 deletion v2rayN/v2rayN/ViewModels/DNSSettingViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ private void SaveSetting()
if (!Utils.IsNullOrEmpty(normalDNS))
{
var obj = JsonUtils.ParseJson(normalDNS);
if (obj != null && obj.ContainsKey("servers") == true)
if (obj != null && obj["servers"] != null)
{
}
else
Expand Down

0 comments on commit 2e30c04

Please sign in to comment.