111,097
社区成员




public class Rootobject : attribute<Rootobject, Attributes>
{
public maybeArray<Match> match;
}
public class Attributes
{
public DateTime time;
public string timestamp;
}
public class Match : attribute<Match, Attributes1>
{
public DateTime time;
public string group;
public string hteam;
public string ateam;
public Results results;
}
public class Attributes1
{
public string id;
public string xsid;
public string gsmid;
public DateTime last_updated;
}
public class Results
{
public string status;
public Periods periods;
public Result[] result;
}
public class Periods
{
public Period[] period;
}
public class Period : attribute<Period, Attributes2>
{
public Detail detail;
}
public class Attributes2
{
public string id;
public string name;
}
public class Detail : attribute<Detail, Attributes3>
{
}
public class Attributes3
{
public string name;
public string value;
}
public class Result : attribute<Result, Attributes4>
{
}
public class Attributes4
{
public string id;
public string name;
public string value;
}
对于 Array 的处理,需要定义自定义解析,比如 public struct maybeArray<valueType>
{
public valueType Value;
public valueType[] Array;
public bool IsArray;
[fastCSharp.emit.jsonParse.custom]
private unsafe static void parseJson(fastCSharp.emit.jsonParser parser, ref maybeArray<valueType> value)
{
if (parser.IsArray())
{
parser.Parse(ref value.Array);
value.IsArray = true;
}
else parser.Parse(ref value.Value);
}
}
对于名称匹配问题也需要自定义解析,比如 public abstract class attribute<valueType, attributeType>
where valueType : attribute<valueType, attributeType>
{
public attributeType attributes;
[fastCSharp.emit.jsonParse.unknownName]
protected unsafe static void jsonParseUnknownName(fastCSharp.emit.jsonParser parser, ref valueType value, ref pointer.size name)
{
if (name.Equals("@attributes")) parser.Parse(ref value.attributes);
else parser.Ignore();
}
}
然后就可以正常使用了 Rootobject value = fastCSharp.emit.jsonParser.Parse<Rootobject>(json);
Regex.Replace(json1, @"""match"":\{([\s\S]*)\}(?=\})", @"""match"":[{$1}]")
match部分可以这样替换,但你举得例子中,result都是数组,{}直接替换成null,这个就是普通的replace
{"@attributes":{"time":"2017-01-18T01:51:16+00:00","timestamp":"1484704276"},
"match":
{"@attributes":{"id":"3915068","xsid":"0","gsmid":"221925","last_updated":"2017-01-18T01:48:20+00:00"},
"time":"2017-01-18T00:00:00+00:00","group":"BANCAA NCAA Division I > Regular Season-16","hteam":"Fairfield","ateam":"St Peters",
"results":{"status":"Fin",
"result":[
{"@attributes":{"id":"1","name":"CURRENT","value":"55-69"}},
{"@attributes":{"id":"2","name":"FT","value":"55-69"}},
{"@attributes":{"id":"3","name":"HT","value":"27-38"}}],
"periods":{"period":[
{"@attributes":{"id":"1","name":"1Q"},"detail":{"@attributes":{"name":"SCORE","value":"27-38"}}},
{"@attributes":{"id":"2","name":"2Q"},"detail":{"@attributes":{"name":"SCORE","value":"28-31"}}},
{"@attributes":{"id":"3","name":"3Q"},"detail":{"@attributes":{"name":"SCORE","value":"-"}}},
{"@attributes":{"id":"4","name":"4Q"},"detail":{"@attributes":{"name":"SCORE","value":"-"}}},
{"@attributes":{"id":"5","name":"OT"},"detail":{"@attributes":{"name":"SCORE","value":"0-0"}}}]}}}
}
{"@attributes":{"time":"2017-01-18T01:51:16+00:00","timestamp":"1484704276"},
"match":[
{"@attributes":{"id":"3915068","xsid":"0","gsmid":"221925","last_updated":"2017-01-18T01:48:20+00:00"},
"time":"2017-01-18T00:00:00+00:00","group":"BANCAA NCAA Division I > Regular Season-16","hteam":"Fairfield","ateam":"St Peters",
"results":{"status":"Fin",
"result":[
{"@attributes":{"id":"1","name":"CURRENT","value":"55-69"}},
{"@attributes":{"id":"2","name":"FT","value":"55-69"}},
{"@attributes":{"id":"3","name":"HT","value":"27-38"}}],
"periods":{"period":[
{"@attributes":{"id":"1","name":"1Q"},"detail":{"@attributes":{"name":"SCORE","value":"27-38"}}},
{"@attributes":{"id":"2","name":"2Q"},"detail":{"@attributes":{"name":"SCORE","value":"28-31"}}},
{"@attributes":{"id":"3","name":"3Q"},"detail":{"@attributes":{"name":"SCORE","value":"-"}}},
{"@attributes":{"id":"4","name":"4Q"},"detail":{"@attributes":{"name":"SCORE","value":"-"}}},
{"@attributes":{"id":"5","name":"OT"},"detail":{"@attributes":{"name":"SCORE","value":"0-0"}}}]}}},
{"@attributes":{"id":"3915097","xsid":"0","gsmid":"221933","last_updated":"2017-01-18T01:51:12+00:00"},
"time":"2017-01-18T00:00:00+00:00","group":"BANCAA NCAA Division I > Regular Season-16","hteam":"Central Florida","ateam":"South Florida",
"results":{"status":"Fin",
"result":[
{"@attributes":{"id":"1","name":"CURRENT","value":"86-64"}},
{"@attributes":{"id":"2","name":"FT","value":"86-64"}},
{"@attributes":{"id":"3","name":"HT","value":"42-30"}}],
"periods":{"period":[
{"@attributes":{"id":"1","name":"1Q"},"detail":{"@attributes":{"name":"SCORE","value":"42-30"}}},
{"@attributes":{"id":"2","name":"2Q"},"detail":{"@attributes":{"name":"SCORE","value":"44-34"}}},
{"@attributes":{"id":"3","name":"3Q"},"detail":{"@attributes":{"name":"SCORE","value":"-"}}},
{"@attributes":{"id":"4","name":"4Q"},"detail":{"@attributes":{"name":"SCORE","value":"-"}}},
{"@attributes":{"id":"5","name":"OT"},"detail":{"@attributes":{"name":"SCORE","value":"0-0"}}}]}}}]}
{"@attributes":{"time":"2017-01-18T01:51:16+00:00","timestamp":"1484704276"},
"match":[
{"@attributes":{"id":"3915063","xsid":"0","gsmid":"221920","last_updated":"2017-01-18T01:46:34+00:00"},
"time":"2017-01-18T00:00:00+00:00","group":"BANCAA NCAA Division I > Regular Season-16","hteam":"Toledo","ateam":"Bowling Green",
"results":{"status":"2Q","periods":{},"scorers":{}}},
{"@attributes":{"id":"3915068","xsid":"0","gsmid":"221925","last_updated":"2017-01-18T01:48:20+00:00"},
"time":"2017-01-18T00:00:00+00:00","group":"BANCAA NCAA Division I > Regular Season-16","hteam":"Fairfield","ateam":"St Peters",
"results":{"status":"Fin","result":[
{"@attributes":{"id":"1","name":"CURRENT","value":"55-69"}},
{"@attributes":{"id":"2","name":"FT","value":"55-69"}},
{"@attributes":{"id":"3","name":"HT","value":"27-38"}}],
"periods":{"period":[
{"@attributes":{"id":"1","name":"1Q"},"detail":{"@attributes":{"name":"SCORE","value":"27-38"}}},
{"@attributes":{"id":"2","name":"2Q"},"detail":{"@attributes":{"name":"SCORE","value":"28-31"}}},
{"@attributes":{"id":"3","name":"3Q"},"detail":{"@attributes":{"name":"SCORE","value":"-"}}},
{"@attributes":{"id":"4","name":"4Q"},"detail":{"@attributes":{"name":"SCORE","value":"-"}}},
{"@attributes":{"id":"5","name":"OT"},"detail":{"@attributes":{"name":"SCORE","value":"0-0"}}}]
}}}]}
class Results
{
public string status;
public Result[] result; // 可选
public Periods periods; // 可选
public Scores scorers; // 可选
}
{"@attributes":{"time":"2017-01-18T01:51:16+00:00","timestamp":"1484704276"},"match":{"@attributes":{"id":"3915068","xsid":"0","gsmid":"221925","last_updated":"2017-01-18T01:48:20+00:00"},"time":"2017-01-18T00:00:00+00:00","group":"BANCAA NCAA Division I > Regular Season-16","hteam":"Fairfield","ateam":"St Peters","results":{"status":"Fin","result":[{"@attributes":{"id":"1","name":"CURRENT","value":"55-69"}},{"@attributes":{"id":"2","name":"FT","value":"55-69"}},{"@attributes":{"id":"3","name":"HT","value":"27-38"}}],"periods":{"period":[{"@attributes":{"id":"1","name":"1Q"},"detail":{"@attributes":{"name":"SCORE","value":"27-38"}}},{"@attributes":{"id":"2","name":"2Q"},"detail":{"@attributes":{"name":"SCORE","value":"28-31"}}},{"@attributes":{"id":"3","name":"3Q"},"detail":{"@attributes":{"name":"SCORE","value":"-"}}},{"@attributes":{"id":"4","name":"4Q"},"detail":{"@attributes":{"name":"SCORE","value":"-"}}},{"@attributes":{"id":"5","name":"OT"},"detail":{"@attributes":{"name":"SCORE","value":"0-0"}}}]}}}}
{"@attributes":{"time":"2017-01-18T01:51:16+00:00","timestamp":"1484704276"},"match":[{"@attributes":{"id":"3915068","xsid":"0","gsmid":"221925","last_updated":"2017-01-18T01:48:20+00:00"},"time":"2017-01-18T00:00:00+00:00","group":"BANCAA NCAA Division I > Regular Season-16","hteam":"Fairfield","ateam":"St Peters","results":{"status":"Fin","result":[{"@attributes":{"id":"1","name":"CURRENT","value":"55-69"}},{"@attributes":{"id":"2","name":"FT","value":"55-69"}},{"@attributes":{"id":"3","name":"HT","value":"27-38"}}],"periods":{"period":[{"@attributes":{"id":"1","name":"1Q"},"detail":{"@attributes":{"name":"SCORE","value":"27-38"}}},{"@attributes":{"id":"2","name":"2Q"},"detail":{"@attributes":{"name":"SCORE","value":"28-31"}}},{"@attributes":{"id":"3","name":"3Q"},"detail":{"@attributes":{"name":"SCORE","value":"-"}}},{"@attributes":{"id":"4","name":"4Q"},"detail":{"@attributes":{"name":"SCORE","value":"-"}}},{"@attributes":{"id":"5","name":"OT"},"detail":{"@attributes":{"name":"SCORE","value":"0-0"}}}]}}},{"@attributes":{"id":"3915097","xsid":"0","gsmid":"221933","last_updated":"2017-01-18T01:51:12+00:00"},"time":"2017-01-18T00:00:00+00:00","group":"BANCAA NCAA Division I > Regular Season-16","hteam":"Central Florida","ateam":"South Florida","results":{"status":"Fin","result":[{"@attributes":{"id":"1","name":"CURRENT","value":"86-64"}},{"@attributes":{"id":"2","name":"FT","value":"86-64"}},{"@attributes":{"id":"3","name":"HT","value":"42-30"}}],"periods":{"period":[{"@attributes":{"id":"1","name":"1Q"},"detail":{"@attributes":{"name":"SCORE","value":"42-30"}}},{"@attributes":{"id":"2","name":"2Q"},"detail":{"@attributes":{"name":"SCORE","value":"44-34"}}},{"@attributes":{"id":"3","name":"3Q"},"detail":{"@attributes":{"name":"SCORE","value":"-"}}},{"@attributes":{"id":"4","name":"4Q"},"detail":{"@attributes":{"name":"SCORE","value":"-"}}},{"@attributes":{"id":"5","name":"OT"},"detail":{"@attributes":{"name":"SCORE","value":"0-0"}}}]}}}]}
{"@attributes":{"time":"2017-01-18T01:51:16+00:00","timestamp":"1484704276"},"match":[{"@attributes":{"id":"3915063","xsid":"0","gsmid":"221920","last_updated":"2017-01-18T01:46:34+00:00"},"time":"2017-01-18T00:00:00+00:00","group":"BANCAA NCAA Division I > Regular Season-16","hteam":"Toledo","ateam":"Bowling Green","results":{"status":"2Q","periods":{},"scorers":{}}},{"@attributes":{"id":"3915068","xsid":"0","gsmid":"221925","last_updated":"2017-01-18T01:48:20+00:00"},"time":"2017-01-18T00:00:00+00:00","group":"BANCAA NCAA Division I > Regular Season-16","hteam":"Fairfield","ateam":"St Peters","results":{"status":"Fin","result":[{"@attributes":{"id":"1","name":"CURRENT","value":"55-69"}},{"@attributes":{"id":"2","name":"FT","value":"55-69"}},{"@attributes":{"id":"3","name":"HT","value":"27-38"}}],"periods":{"period":[{"@attributes":{"id":"1","name":"1Q"},"detail":{"@attributes":{"name":"SCORE","value":"27-38"}}},{"@attributes":{"id":"2","name":"2Q"},"detail":{"@attributes":{"name":"SCORE","value":"28-31"}}},{"@attributes":{"id":"3","name":"3Q"},"detail":{"@attributes":{"name":"SCORE","value":"-"}}},{"@attributes":{"id":"4","name":"4Q"},"detail":{"@attributes":{"name":"SCORE","value":"-"}}},{"@attributes":{"id":"5","name":"OT"},"detail":{"@attributes":{"name":"SCORE","value":"0-0"}}}]}}}]}
注意对象 Match Result, 可能是对象,可能是数组。而且不排除其他属性,如SCORE,detail等,也可能是数组
// 方法三:
static Result[] Deserialize(string json)
{
var firstChar = json.FirstOrDefault(x => !char.IsWhiteSpace(x));
if (firstChar == '[') return JsonConvert.DeserializeObject<Result[]>(json);
var r = JsonConvert.DeserializeObject<Result>(json);
return r == null ? null : new Result[] { r };
}
class Result
{
public int Id { get; set; }
}
static void Main(string[] args)
{
var json = "[{'Id':1},{'Id':2}]";
var tk= JToken.Parse(json);
if (tk is JArray)
{
Result[] rs = tk.ToObject<Result[]>();
}
else
{
Result r = tk.ToObject<Result>();
}
}
class ArrayWrapper<T>
{
T _a;
T[] _b;
public ArrayWrapper(object o)
{
if (o is T)
_a = (T)o;
else if (o is T[])
_b = (T[])o;
}
public int Count
{
get { return _a == null ? (_b == null ? 0 : _b.Length) : 1; }
}
public T this[int index]
{
get { return _a == null ? (_b == null ? default(T) : _b[index]) : (index == 0 ? _a : default(T)); }
}
}