CSharp · Console
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public class Data
{
public string assetName{get;set;} //'assetName': 'avatar',
public string id{get;set;} //'id': '-M4qRmfnFya7bC43Ujye',
public string imageName{get;set;} //'imageName': 'icon_avatar',
public string name{get;set;} //'name': 'Bob',
public string objName{get;set;} //'objName': 'Bobby',
public string point{get;set;} //'point': '-M4vZRY9vhKs65n5L_Gk',
public string versionNumber{get;set;} //'versionNumber': '3'
}
public class Program
{
public static JToken DeserializeAndCombineDuplicates(JsonTextReader reader)
{
if (reader.TokenType == JsonToken.None)
{
reader.Read();
}
if (reader.TokenType == JsonToken.StartObject)
{
reader.Read();
JObject obj = new JObject();
while (reader.TokenType != JsonToken.EndObject)
{
string propName = (string)reader.Value;
reader.Read();
JToken newValue = DeserializeAndCombineDuplicates(reader);
JToken existingValue = obj[propName];
if (existingValue == null)
{
obj.Add(new JProperty(propName, newValue));
}
else if (existingValue.Type == JTokenType.Array)
{
CombineWithArray((JArray)existingValue, newValue);
}
else // Convert existing non-array property value to an array
{
JProperty prop = (JProperty)existingValue.Parent;
JArray array = new JArray();
prop.Value = array;
array.Add(existingValue);
CombineWithArray(array, newValue);
}
reader.Read();
}
return obj;
}
if (reader.TokenType == JsonToken.StartArray)
{
reader.Read();
JArray array = new JArray();
while (reader.TokenType != JsonToken.EndArray)
{
array.Add(DeserializeAndCombineDuplicates(reader));
reader.Read();
}
return array;
}
return new JValue(reader.Value);
}
private static void CombineWithArray(JArray array, JToken value)
{
if (value.Type == JTokenType.Array)
{
foreach (JToken child in value.Children())
array.Add(child);
}
else
{
array.Add(value);
}
}
public static void Main()
{
var json=@"
{
'-M4qRmfIqhKdy643Ujye': {
'assetName': 'avatar',
'id': '-M4qRmfnFya7bC43Ujye',
'imageName': 'icon_avatar',
'name': 'Bob',
'objName': 'Bobby',
'point': '-M4vZRY9vhKs65n5L_Gk',
'versionNumber': '3'
},
'-M4qRmfIqhKdy643Ujye': {
'assetName': 'avatar',
'id': '-M4qRmfnFya7bC43Ujye',
'imageName': 'icon_avatar',
'name': 'Bobfds',
'objName': 'Bobbydsf',
'point': '-M4vZRY9vhKs65n5L_Gk',
'versionNumber': '3'
},
'-M4qRmfIqhKdy643Ujye': {
'assetName': 'avatar',
'id': '-M4qRmfnFya7bC43Ujye',
'imageName': 'icon_avatar',
'name': 'Bobfdsa',
'objName': 'Bobbyfc',
'point': '-M4vZRY9vhKs65n5L_Gk',
'versionNumber': '3'
}
}
";
using (StringReader sr = new StringReader(json))
using (JsonTextReader reader = new JsonTextReader(sr))
{
var parsed = DeserializeAndCombineDuplicates(reader).ToObject<Dictionary<string, Data[]>>();
if(parsed!=null)
{
parsed
.ToList()
.ForEach(x=>Console.WriteLine("\r\nkey={0}\r\nvalues:\r\n{1}"
, x.Key
, string.Join("\r\n", x.Value
.Select(z=>string.Join("\t\t", z.name, z.id, z.objName))
.ToArray())));
} else Console.WriteLine("No way, dude!");
}
}
}