考慮json字串:
var json = "{\"myfield\":5e-0000006}";
我想反序列化該 json,并將欄位“myfield”作為原始字串。例子:
JToken tok = <Deserialize> // how do this??
var val = tok["myfield"].ToString(); // need get "5e-0000006"
我需要獲取原始字串中的確切字串值(例如“5e-0000006”,但它可能是任何有效的浮點字串)。
uj5u.com熱心網友回復:
一些資訊和靈感來自:
- 您不需要撰寫任何轉換器,只需使用 JRaw 型別,如下所示:
- 檔案:此示例將 JSON 反序列化為物件。
static void Main(string[] args)
{
var json = "{\"myfield\":5e-0000006}";
MyJson j = JsonConvert.DeserializeObject<MyJson>(json);
string mf = j.myfield;
Console.WriteLine(mf);
}
public class MyJson
{
[JsonProperty("myfield")]
public string myfield { get; set; }
}
這將輸出: 5e-0000006
我仍然想知道為什么我不使用JRaw......??
uj5u.com熱心網友回復:
由于您想要一個確切的字串并且您實際上擁有的 json 是一個數字(這意味著5e-0000006將等于5e-6)我建議使用正則運算式:
string json = "{\"myfield\":5e-0000006}";
Regex regex = new Regex("(?<=:)[^}] ");
string result = regex.Match(json).Value;
說明:
(?<=:)在后面尋找冒號 ( :)
[^}] 匹配任何不是右花括號 ( }) 的字符,一次或多次。
那應該給你一個精確字串的值。
更新:
如果要根據myfield變數進行匹配,可以擴展正則運算式以包含該資訊:
string json = "{\"myfield\":5e-0000006}";
Regex regex = new Regex("(?<=\"myfield\":)[^}] ");
string result = regex.Match(json).Value;
現在你只會得到你\"myfield\"前面的那條線 - 如果你有很多條線。
您當然可以\"myfield\"用變數替換,如下所示:
string json = "{\"myfield\":5e-0000006}";
string myvar = "myfield";
Regex regex = new Regex("(?<=\"" myvar "\":)[^}] ");
string result = regex.Match(json).Value;
uj5u.com熱心網友回復:
我完成了為 System.Text.Json 創建一個簡單的包裝器
class MyJToken {
JsonElement cur;
string fieldName;
public bool IsNull { get; private set; }
public MyJToken(JsonElement cur, string fieldName) {
this.cur = cur;
this.fieldName = fieldName;
}
public MyJToken() {
IsNull = true;
}
public override string ToString() {
if (IsNull) {
return "null";
}
return cur.ToString();
}
public static MyJToken Parse(string json) {
JsonDocument doc = JsonDocument.Parse(json);
return new MyJToken(doc.RootElement, "root");
}
public IEnumerable<(string, MyJToken)> EnumKeyVal() {
foreach(var elem in cur.EnumerateObject()) {
yield return (elem.Name, new MyJToken(elem.Value, elem.Name));
}
yield break;
}
public IEnumerable<MyJToken> EnumList() {
foreach (var elem in cur.EnumerateArray()) {
yield return new MyJToken(elem, "");
}
yield break;
}
public MyJToken get(string name) {
return this[name];
}
public MyJToken this[string key] {
get {
if (!cur.TryGetProperty(key, out var value))
return new MyJToken();
return new MyJToken(value, key);
}
}
public MyJToken this[int key] {
get => new MyJToken(cur[key], key.ToString());
}
void SayNotFound() {
throw new Exception($"Filed {fieldName} not found");
}
public string STR() {
if (IsNull) SayNotFound();
return cur.GetString();
}
public string STR(string def) {
if (IsNull) return def;
return STR();
}
public string RAW() {
if (IsNull) SayNotFound();
return cur.GetRawText();
}
public string RAW(string def) {
if (IsNull) return def;
return RAW();
}
public decimal DEC() {
if (IsNull) SayNotFound();
return cur.GetDecimal();
}
public decimal DEC(decimal def) {
if (IsNull) return def;
return DEC();
}
public long LONG() {
if (IsNull) SayNotFound();
return cur.GetInt64();
}
public long LONG(long def) {
if (IsNull) return def;
return LONG();
}
}
現在我可以得到任何我想要的:
var json = "{\"myfield\":5e-0000006}";
var root = MyJToken.Parse(json);
var tok = root["myfield"];
Console.WriteLine($"num={tok.DEC()} raw={tok.RAW()}");
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/388486.html
