UnmarshalLogMessage to use json.Number (#178)

diff --git a/logging_test.go b/logging_test.go
index de34a24..5ffc044 100644
--- a/logging_test.go
+++ b/logging_test.go
@@ -3,6 +3,7 @@
 package tfjson
 
 import (
+	"encoding/json"
 	"testing"
 	"time"
 
@@ -132,7 +133,7 @@
 					DisplayName:  "This is a easy-antelope",
 					Identity: map[string]any{
 						"id":   "easy-antelope",
-						"legs": float64(6),
+						"legs": json.Number("6"),
 					},
 					IdentityVersion: 1,
 				},
diff --git a/logging_types.go b/logging_types.go
index 3e712a0..6f9008c 100644
--- a/logging_types.go
+++ b/logging_types.go
@@ -3,6 +3,7 @@
 package tfjson
 
 import (
+	"bytes"
 	"encoding/json"
 )
 
@@ -29,31 +30,36 @@
 }
 
 func unmarshalByType(t LogMessageType, b []byte) (LogMsg, error) {
+	d := json.NewDecoder(bytes.NewReader(b))
+
+	// decode numbers as json.Number to avoid losing precision
+	d.UseNumber()
+
 	switch t {
 
 	// generic
 	case MessageTypeVersion:
 		v := VersionLogMessage{}
-		return v, json.Unmarshal(b, &v)
+		return v, d.Decode(&v)
 	case MessageTypeLog:
 		v := LogMessage{}
-		return v, json.Unmarshal(b, &v)
+		return v, d.Decode(&v)
 	case MessageTypeDiagnostic:
 		v := DiagnosticLogMessage{}
-		return v, json.Unmarshal(b, &v)
+		return v, d.Decode(&v)
 
 	// query
 	case MessageListStart:
 		v := ListStartMessage{}
-		return v, json.Unmarshal(b, &v)
+		return v, d.Decode(&v)
 	case MessageListResourceFound:
 		v := ListResourceFoundMessage{}
-		return v, json.Unmarshal(b, &v)
+		return v, d.Decode(&v)
 	case MessageListComplete:
 		v := ListCompleteMessage{}
-		return v, json.Unmarshal(b, &v)
+		return v, d.Decode(&v)
 	}
 
 	v := UnknownLogMessage{}
-	return v, json.Unmarshal(b, &v)
+	return v, d.Decode(&v)
 }