如何对 json 字符串进行投影
How to do a projection on json string
如何查询一些json到select一个特定的属性?
EX:如果我有这样的 Json obj
:
[
{
"grd_symbol":"A+",
"count":21.23,
"code":4,
"name":"X",
"batch_no":760
},
{
"grd_symbol":"A ",
"count":11.93,
"code":4,
"name":"X",
"batch_no":760
},
{
"grd_symbol":"A-",
"count":8.49,
"code":4,
"name":"X",
"batch_no":760
}
]
这是 :
的输出
string JsonObj = Converter.ConvertDataTabletoString(DT);
public static string ConvertDataTabletoString(DataTable dt)
{
System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (DataRow dr in dt.Rows)
{
row = new Dictionary<string, object>();
foreach (DataColumn col in dt.Columns)
{
row.Add(col.ColumnName, dr[col]);
}
rows.Add(row);
}
return serializer.Serialize(rows);
}
现在我只想得到count
,结果是这样的:
[21.23,11.93,8.49]
使用这个,我们可以创建一个对象来匹配 json 字符串:
public class MyCustomObject
{
[JsonProperty("grd_symbol")] public string GridSymbol {get; set;}
[JsonProperty("count")] public double Count {get; set;}
[JsonProperty("code")] public int Code {get; set;}
[JsonProperty("name")] public string Name {get; set;}
[JsonProperty("batch_no")] public int BatchNumber {get; set;}
}
然后你可以使用上面提到的库反序列化你的json:
var myData = JsonConvert.DeserializeObject<MyCustomObject[]>(jsonString);
然后,由于您需要一个计数数组,您可以使用 LINQ 使用 Select
:
获取它们
var countArray = myData.Select(x => x.Count);
当然,如果你想将其输出为字符串,你可以再次序列化它:
var countString = JsonConvert.SerializeObject(countArray);
您甚至不必将所有 属性 反序列化为 select,您只需在 calss 定义中省略不需要的一个,这样它们就会被忽略。
使用:
public class SimplifyRootObject
{
public double count { get; set; }
}
而不是:
public class RootObject
{
public string grd_symbol { get; set; }
public double count { get; set; }
public int code { get; set; }
public string name { get; set; }
public int batch_no { get; set; }
}
然后一个简单的 string.Join()
添加逗号就可以了。
$"[{string.Join("_separator_", myListOfDouble)}]"
MCVE:
public static void Main(string[] args)
{
string input = @"[
{
""grd_symbol"":""A+"",
""count"":21.23,
""code"":4,
""name"":""X"",
""batch_no"":760
},
{
""grd_symbol"":""A "",
""count"":11.93,
""code"":4,
""name"":""X"",
""batch_no"":760
},
{
""grd_symbol"":""A-"",
""count"":8.49,
""code"":4,
""name"":""X"",
""batch_no"":760
}
]";
// Deserialize All, select the wanted.
var m = JsonConvert.DeserializeObject<List<RootObject>>(input);
var result = m.Select(x=> x.count);
Console.WriteLine("["+string.Join(", ", result)+"]");
// Deserialize only one, select it.
var m2 = JsonConvert.DeserializeObject<List<SimplifyRootObject>>(input);
var result2 = m.Select(x=> x.count);
Console.WriteLine("["+string.Join(", ", result2)+"]");
}
}
您的主题标签是 "how to do a projection on json string",您告诉我们您已经有一个要转换为字符串的 DataTable。
您给我们的代码表示 "I want to serialize my datatable into a JSON string"。
最后,你还需要什么?字符串数组?一个字符串?一个 json 对象 ?
如果它是一个字符串,我建议您覆盖 DataTable 的 ToString() 方法以获取您想要的格式,即 [number1, number2, number3] 通过获取数据表并返回一个 STRING 而不是 JSON.
编辑。我想@ThePerplexedOne 已经回答了这个问题。
如何查询一些json到select一个特定的属性?
EX:如果我有这样的 Json obj
:
[
{
"grd_symbol":"A+",
"count":21.23,
"code":4,
"name":"X",
"batch_no":760
},
{
"grd_symbol":"A ",
"count":11.93,
"code":4,
"name":"X",
"batch_no":760
},
{
"grd_symbol":"A-",
"count":8.49,
"code":4,
"name":"X",
"batch_no":760
}
]
这是 :
的输出string JsonObj = Converter.ConvertDataTabletoString(DT);
public static string ConvertDataTabletoString(DataTable dt)
{
System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (DataRow dr in dt.Rows)
{
row = new Dictionary<string, object>();
foreach (DataColumn col in dt.Columns)
{
row.Add(col.ColumnName, dr[col]);
}
rows.Add(row);
}
return serializer.Serialize(rows);
}
现在我只想得到count
,结果是这样的:
[21.23,11.93,8.49]
使用这个,我们可以创建一个对象来匹配 json 字符串:
public class MyCustomObject
{
[JsonProperty("grd_symbol")] public string GridSymbol {get; set;}
[JsonProperty("count")] public double Count {get; set;}
[JsonProperty("code")] public int Code {get; set;}
[JsonProperty("name")] public string Name {get; set;}
[JsonProperty("batch_no")] public int BatchNumber {get; set;}
}
然后你可以使用上面提到的库反序列化你的json:
var myData = JsonConvert.DeserializeObject<MyCustomObject[]>(jsonString);
然后,由于您需要一个计数数组,您可以使用 LINQ 使用 Select
:
var countArray = myData.Select(x => x.Count);
当然,如果你想将其输出为字符串,你可以再次序列化它:
var countString = JsonConvert.SerializeObject(countArray);
您甚至不必将所有 属性 反序列化为 select,您只需在 calss 定义中省略不需要的一个,这样它们就会被忽略。
使用:
public class SimplifyRootObject
{
public double count { get; set; }
}
而不是:
public class RootObject
{
public string grd_symbol { get; set; }
public double count { get; set; }
public int code { get; set; }
public string name { get; set; }
public int batch_no { get; set; }
}
然后一个简单的 string.Join()
添加逗号就可以了。
$"[{string.Join("_separator_", myListOfDouble)}]"
MCVE:
public static void Main(string[] args)
{
string input = @"[
{
""grd_symbol"":""A+"",
""count"":21.23,
""code"":4,
""name"":""X"",
""batch_no"":760
},
{
""grd_symbol"":""A "",
""count"":11.93,
""code"":4,
""name"":""X"",
""batch_no"":760
},
{
""grd_symbol"":""A-"",
""count"":8.49,
""code"":4,
""name"":""X"",
""batch_no"":760
}
]";
// Deserialize All, select the wanted.
var m = JsonConvert.DeserializeObject<List<RootObject>>(input);
var result = m.Select(x=> x.count);
Console.WriteLine("["+string.Join(", ", result)+"]");
// Deserialize only one, select it.
var m2 = JsonConvert.DeserializeObject<List<SimplifyRootObject>>(input);
var result2 = m.Select(x=> x.count);
Console.WriteLine("["+string.Join(", ", result2)+"]");
}
}
您的主题标签是 "how to do a projection on json string",您告诉我们您已经有一个要转换为字符串的 DataTable。
您给我们的代码表示 "I want to serialize my datatable into a JSON string"。
最后,你还需要什么?字符串数组?一个字符串?一个 json 对象 ?
如果它是一个字符串,我建议您覆盖 DataTable 的 ToString() 方法以获取您想要的格式,即 [number1, number2, number3] 通过获取数据表并返回一个 STRING 而不是 JSON.
编辑。我想@ThePerplexedOne 已经回答了这个问题。