.NET Decompiler with support for PDB generation, ReadyToRun, Metadata (&more) - cross-platform!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

241 lines
6.6 KiB

// Copyright (c) Tunnel Vision Laboratories, LLC. All Rights Reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
namespace LightJson
{
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
/// <summary>
/// Represents a key-value pair collection of JsonValue objects.
/// </summary>
[DebuggerDisplay("Count = {Count}")]
[DebuggerTypeProxy(typeof(JsonObjectDebugView))]
internal sealed class JsonObject : IEnumerable<KeyValuePair<string, JsonValue>>, IEnumerable<JsonValue>
{
private IDictionary<string, JsonValue> properties;
/// <summary>
/// Initializes a new instance of the <see cref="JsonObject"/> class.
/// </summary>
public JsonObject()
{
this.properties = new Dictionary<string, JsonValue>();
}
/// <summary>
/// Gets the number of properties in this JsonObject.
/// </summary>
/// <value>The number of properties in this JsonObject.</value>
public int Count {
get {
return this.properties.Count;
}
}
/// <summary>
/// Gets or sets the property with the given key.
/// </summary>
/// <param name="key">The key of the property to get or set.</param>
/// <remarks>
/// The getter will return JsonValue.Null if the given key is not assosiated with any value.
/// </remarks>
public JsonValue this[string key] {
get {
JsonValue value;
if (this.properties.TryGetValue(key, out value)) {
return value;
} else {
return JsonValue.Null;
}
}
set {
this.properties[key] = value;
}
}
/// <summary>
/// Adds a key with a null value to this collection.
/// </summary>
/// <param name="key">The key of the property to be added.</param>
/// <remarks>Returns this JsonObject.</remarks>
/// <returns>The <see cref="JsonObject"/> that was added.</returns>
public JsonObject Add(string key)
{
return this.Add(key, JsonValue.Null);
}
/// <summary>
/// Adds a value associated with a key to this collection.
/// </summary>
/// <param name="key">The key of the property to be added.</param>
/// <param name="value">The value of the property to be added.</param>
/// <returns>Returns this JsonObject.</returns>
public JsonObject Add(string key, JsonValue value)
{
this.properties.Add(key, value);
return this;
}
/// <summary>
/// Removes a property with the given key.
/// </summary>
/// <param name="key">The key of the property to be removed.</param>
/// <returns>
/// Returns true if the given key is found and removed; otherwise, false.
/// </returns>
public bool Remove(string key)
{
return this.properties.Remove(key);
}
/// <summary>
/// Clears the contents of this collection.
/// </summary>
/// <returns>Returns this JsonObject.</returns>
public JsonObject Clear()
{
this.properties.Clear();
return this;
}
/// <summary>
/// Changes the key of one of the items in the collection.
/// </summary>
/// <remarks>
/// This method has no effects if the <i>oldKey</i> does not exists.
/// If the <i>newKey</i> already exists, the value will be overwritten.
/// </remarks>
/// <param name="oldKey">The name of the key to be changed.</param>
/// <param name="newKey">The new name of the key.</param>
/// <returns>Returns this JsonObject.</returns>
public JsonObject Rename(string oldKey, string newKey)
{
if (oldKey == newKey) {
// Renaming to the same name just does nothing
return this;
}
JsonValue value;
if (this.properties.TryGetValue(oldKey, out value)) {
this[newKey] = value;
this.Remove(oldKey);
}
return this;
}
/// <summary>
/// Determines whether this collection contains an item assosiated with the given key.
/// </summary>
/// <param name="key">The key to locate in this collection.</param>
/// <returns>Returns true if the key is found; otherwise, false.</returns>
public bool ContainsKey(string key)
{
return this.properties.ContainsKey(key);
}
/// <summary>
/// Determines whether this collection contains the given JsonValue.
/// </summary>
/// <param name="value">The value to locate in this collection.</param>
/// <returns>Returns true if the value is found; otherwise, false.</returns>
public bool Contains(JsonValue value)
{
return this.properties.Values.Contains(value);
}
/// <summary>
/// Returns an enumerator that iterates through this collection.
/// </summary>
/// <returns>The enumerator that iterates through this collection.</returns>
public IEnumerator<KeyValuePair<string, JsonValue>> GetEnumerator()
{
return this.properties.GetEnumerator();
}
/// <summary>
/// Returns an enumerator that iterates through this collection.
/// </summary>
/// <returns>The enumerator that iterates through this collection.</returns>
IEnumerator<JsonValue> IEnumerable<JsonValue>.GetEnumerator()
{
return this.properties.Values.GetEnumerator();
}
/// <summary>
/// Returns an enumerator that iterates through this collection.
/// </summary>
/// <returns>The enumerator that iterates through this collection.</returns>
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
[ExcludeFromCodeCoverage]
private class JsonObjectDebugView
{
private JsonObject jsonObject;
public JsonObjectDebugView(JsonObject jsonObject)
{
this.jsonObject = jsonObject;
}
[DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
public KeyValuePair[] Keys {
get {
var keys = new KeyValuePair[this.jsonObject.Count];
var i = 0;
foreach (var property in this.jsonObject) {
keys[i] = new KeyValuePair(property.Key, property.Value);
i += 1;
}
return keys;
}
}
[DebuggerDisplay("{value.ToString(),nq}", Name = "{key}", Type = "JsonValue({Type})")]
public class KeyValuePair
{
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private string key;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private JsonValue value;
public KeyValuePair(string key, JsonValue value)
{
this.key = key;
this.value = value;
}
[DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
public object View {
get {
if (this.value.IsJsonObject) {
return (JsonObject)this.value;
} else if (this.value.IsJsonArray) {
return (JsonArray)this.value;
} else {
return this.value;
}
}
}
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private JsonValueType Type {
get {
return this.value.Type;
}
}
}
}
}
}